Add spec

Daniel O'Connor 9 years ago
parent
commit
b7346a5cf9

+ 435 - 0
spec/cassettes/Agents_GoogleCalendarPublishAgent/_receive/should_publish_any_payload_it_receives.yml

@@ -0,0 +1,435 @@
1
+---
2
+http_interactions:
3
+- request:
4
+    method: get
5
+    uri: https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest
6
+    body:
7
+      encoding: UTF-8
8
+      string: ''
9
+    headers:
10
+      User-Agent:
11
+      - |-
12
+        Huginn/0.0.1 google-api-ruby-client/0.7.1 Linux/3.13.0-29-generic
13
+         (gzip)
14
+      Accept-Encoding:
15
+      - gzip
16
+      Content-Type:
17
+      - ''
18
+      Accept:
19
+      - "*/*"
20
+  response:
21
+    status:
22
+      code: 200
23
+      message: OK
24
+    headers:
25
+      Expires:
26
+      - Sat, 28 Jun 2014 17:21:12 GMT
27
+      Date:
28
+      - Sat, 28 Jun 2014 17:16:12 GMT
29
+      Etag:
30
+      - '"C11OM5Qtr9122-scy_WeqND9D3o/icy_kevyvyjgCKjN6s1gb_9TUZs"'
31
+      Content-Type:
32
+      - application/json; charset=UTF-8
33
+      Content-Encoding:
34
+      - gzip
35
+      X-Content-Type-Options:
36
+      - nosniff
37
+      X-Frame-Options:
38
+      - SAMEORIGIN
39
+      X-Xss-Protection:
40
+      - 1; mode=block
41
+      Content-Length:
42
+      - '11266'
43
+      Server:
44
+      - GSE
45
+      Age:
46
+      - '195'
47
+      Cache-Control:
48
+      - public, max-age=300, must-revalidate, no-transform
49
+      Alternate-Protocol:
50
+      - 443:quic
51
+    body:
52
+      encoding: ASCII-8BIT
53
+      string: !binary |-
54
+        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
304
+        4Rn8/2/P/j8y14+toGwBAA==
305
+    http_version: 
306
+  recorded_at: Sat, 28 Jun 2014 17:19:27 GMT
307
+- request:
308
+    method: post
309
+    uri: https://accounts.google.com/o/oauth2/token
310
+    body:
311
+      encoding: ASCII-8BIT
312
+      string: grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiIxMDI5OTM2OTY2MzI2LW5jamQ3Nzc2cGNzcGM5OGhzZzgyZ3NiNTZ0MzIxN2VmQGRldmVsb3Blci5nc2VydmljZWFjY291bnQuY29tIiwic2NvcGUiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9hdXRoL2NhbGVuZGFyIiwiYXVkIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3Rva2VuIiwiZXhwIjoxNDAzOTc2MDI3LCJpYXQiOjE0MDM5NzU5MDd9.G2t_IqQofzzXKJAySGu4MulAybOp3BjptAk_tra7-ALy2pWu0jKw8XblP4T0YPgyMcbhcSJ_OhYl7Inmkxc3xhWsN-ZQDtacIyLv9roIRbvm5zCFKceJRISu2nZuIUTGTeoVuotPh6KRRvXIk1RW_Rc7L0eLeGTWn1USqdNwlfU
313
+    headers:
314
+      Cache-Control:
315
+      - no-store
316
+      Content-Type:
317
+      - application/x-www-form-urlencoded
318
+      Accept-Encoding:
319
+      - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
320
+      Accept:
321
+      - "*/*"
322
+      User-Agent:
323
+      - Ruby
324
+  response:
325
+    status:
326
+      code: 200
327
+      message: OK
328
+    headers:
329
+      Content-Type:
330
+      - application/json; charset=utf-8
331
+      Cache-Control:
332
+      - no-cache, no-store, max-age=0, must-revalidate
333
+      Pragma:
334
+      - no-cache
335
+      Expires:
336
+      - Fri, 01 Jan 1990 00:00:00 GMT
337
+      Date:
338
+      - Sat, 28 Jun 2014 17:19:28 GMT
339
+      Content-Disposition:
340
+      - attachment; filename="json.txt"; filename*=UTF-8''json.txt
341
+      X-Content-Type-Options:
342
+      - nosniff
343
+      X-Frame-Options:
344
+      - SAMEORIGIN
345
+      X-Xss-Protection:
346
+      - 1; mode=block
347
+      Server:
348
+      - GSE
349
+      Alternate-Protocol:
350
+      - 443:quic
351
+      Transfer-Encoding:
352
+      - chunked
353
+    body:
354
+      encoding: UTF-8
355
+      string: |-
356
+        {
357
+          "access_token" : "ya29.MgBhhNLHjzGOZBoAAADoyvaDO5G6GHmaxIYqa5EGZ5t8kL-unXKywIRYoYgQxw",
358
+          "token_type" : "Bearer",
359
+          "expires_in" : 3600
360
+        }
361
+    http_version: 
362
+  recorded_at: Sat, 28 Jun 2014 17:19:28 GMT
363
+- request:
364
+    method: post
365
+    uri: https://www.googleapis.com/calendar/v3/calendars/sqv39gj35tc837gdns1g4d81cg@group.calendar.google.com/events?sendNotifications=true
366
+    body:
367
+      encoding: UTF-8
368
+      string: '{"visibility":"default","summary":"Awesome event","description":"An
369
+        example event with text. Pro tip: DateTimes are in RFC3339","end":{"dateTime":"2014-10-02T11:00:00-05:00"},"start":{"dateTime":"2014-10-02T10:00:00-05:00"}}'
370
+    headers:
371
+      User-Agent:
372
+      - |-
373
+        Huginn/0.0.1 google-api-ruby-client/0.7.1 Linux/3.13.0-29-generic
374
+         (gzip)
375
+      Content-Type:
376
+      - application/json
377
+      Accept-Encoding:
378
+      - gzip
379
+      Authorization:
380
+      - Bearer ya29.MgBhhNLHjzGOZBoAAADoyvaDO5G6GHmaxIYqa5EGZ5t8kL-unXKywIRYoYgQxw
381
+      Cache-Control:
382
+      - no-store
383
+      Accept:
384
+      - "*/*"
385
+  response:
386
+    status:
387
+      code: 200
388
+      message: OK
389
+    headers:
390
+      Cache-Control:
391
+      - no-cache, no-store, max-age=0, must-revalidate
392
+      Pragma:
393
+      - no-cache
394
+      Expires:
395
+      - Fri, 01 Jan 1990 00:00:00 GMT
396
+      Date:
397
+      - Sat, 28 Jun 2014 17:19:31 GMT
398
+      Etag:
399
+      - '"BZUCgRsJHN1b3Y4VmmLXiJzEzGI/MjgwNzk1MTk0MTk3MjAwMA"'
400
+      Content-Type:
401
+      - application/json; charset=UTF-8
402
+      Content-Encoding:
403
+      - gzip
404
+      X-Content-Type-Options:
405
+      - nosniff
406
+      X-Frame-Options:
407
+      - SAMEORIGIN
408
+      X-Xss-Protection:
409
+      - 1; mode=block
410
+      Server:
411
+      - GSE
412
+      Alternate-Protocol:
413
+      - 443:quic
414
+      Transfer-Encoding:
415
+      - chunked
416
+    body:
417
+      encoding: ASCII-8BIT
418
+      string: !binary |-
419
+        H4sIAAAAAAAAAH1T0U7bMBR971dY3ePW1IlLmlSaRkdXRkWqCZUxKl6Mfeu6
420
+        iZ1gOw0E8e9LAh2btvFgKc49Pufce+zHHuqnUvP+BPUZzUBzat7BHrTrf2hK
421
+        4KhoSzf9z+vLE3FhF1+X/i25Hn1X6vyHXNRf6tOzYbIT1bJO/WSV4maRZDet
422
+        kulNv6OQHbfd850RocF7mpa3dp9FjJfW5zLtQNZRV9rORK430ijg3f+tU9m5
423
+        1Glb2TpX2MlwWFWVJ/JcZOCxXA0Proed608g+UdG1inVC73UZxVXc8OvFjVX
424
+        1eg6uPBZPU/plRWMzIOkzjTdJT4/TUZJzfX69KhOrhhez8T9dcCn66ozwQxQ
425
+        B10bAfZHAxwOgmjljyd+PAliD2O87nBlwf+LI9iLo/AZZ0ulqHlocdMKbK4A
426
+        vU6cg2VGFk7mugNoBPdUFdkLBlXSbZGDe+ehbyZHThYTNGtkV1KBRdQAkhpd
427
+        zE8IIfGr+9w0ZI891CSqqMxaZh8HcUzCOAxJEA402/HxeBwWzBYsjrZWRIGw
428
+        t0ehI4E/hs0xb+SzvADjCQtmLxlQxvJSuzaEfg89tVq5EVTLGv5Ws3d7Eosd
429
+        OXIsImPBtfXFiEc+E8fC5GXhHWL8LdrWfjMQaYuMPiypgpboaymk1ug8Z7Sd
430
+        UfMhnnEWsk0DcKaEFzfNpTLu4IS/zOhXOj4eYLLCuIlmgvF73GZ06AO6B/Hm
431
+        Of9f5+QJzS7PZm9f+OM/O2yM35WgWauA270B1TxIMPZgobQwgw0tM/faX++p
432
+        9xPxx2cruwMAAA==
433
+    http_version: 
434
+  recorded_at: Sat, 28 Jun 2014 17:19:31 GMT
435
+recorded_with: VCR 2.9.2

+ 2601 - 0
spec/data_fixtures/google_calendar_api.json

@@ -0,0 +1,2601 @@
1
+{
2
+ "kind": "discovery#restDescription",
3
+ "etag": "\"C11OM5Qtr9122-scy_WeqND9D3o/icy_kevyvyjgCKjN6s1gb_9TUZs\"",
4
+ "discoveryVersion": "v1",
5
+ "id": "calendar:v3",
6
+ "name": "calendar",
7
+ "version": "v3",
8
+ "title": "Calendar API",
9
+ "description": "Lets you manipulate events and other calendar data.",
10
+ "ownerDomain": "google.com",
11
+ "ownerName": "Google",
12
+ "icons": {
13
+  "x16": "http://www.google.com/images/icons/product/calendar-16.png",
14
+  "x32": "http://www.google.com/images/icons/product/calendar-32.png"
15
+ },
16
+ "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp",
17
+ "protocol": "rest",
18
+ "baseUrl": "https://www.googleapis.com/calendar/v3/",
19
+ "basePath": "/calendar/v3/",
20
+ "rootUrl": "https://www.googleapis.com/",
21
+ "servicePath": "calendar/v3/",
22
+ "batchPath": "batch",
23
+ "parameters": {
24
+  "alt": {
25
+   "type": "string",
26
+   "description": "Data format for the response.",
27
+   "default": "json",
28
+   "enum": [
29
+    "json"
30
+   ],
31
+   "enumDescriptions": [
32
+    "Responses with Content-Type of application/json"
33
+   ],
34
+   "location": "query"
35
+  },
36
+  "fields": {
37
+   "type": "string",
38
+   "description": "Selector specifying which fields to include in a partial response.",
39
+   "location": "query"
40
+  },
41
+  "key": {
42
+   "type": "string",
43
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
44
+   "location": "query"
45
+  },
46
+  "oauth_token": {
47
+   "type": "string",
48
+   "description": "OAuth 2.0 token for the current user.",
49
+   "location": "query"
50
+  },
51
+  "prettyPrint": {
52
+   "type": "boolean",
53
+   "description": "Returns response with indentations and line breaks.",
54
+   "default": "true",
55
+   "location": "query"
56
+  },
57
+  "quotaUser": {
58
+   "type": "string",
59
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
60
+   "location": "query"
61
+  },
62
+  "userIp": {
63
+   "type": "string",
64
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
65
+   "location": "query"
66
+  }
67
+ },
68
+ "auth": {
69
+  "oauth2": {
70
+   "scopes": {
71
+    "https://www.googleapis.com/auth/calendar": {
72
+     "description": "Manage your calendars"
73
+    },
74
+    "https://www.googleapis.com/auth/calendar.readonly": {
75
+     "description": "View your calendars"
76
+    }
77
+   }
78
+  }
79
+ },
80
+ "schemas": {
81
+  "Acl": {
82
+   "id": "Acl",
83
+   "type": "object",
84
+   "properties": {
85
+    "etag": {
86
+     "type": "string",
87
+     "description": "ETag of the collection."
88
+    },
89
+    "items": {
90
+     "type": "array",
91
+     "description": "List of rules on the access control list.",
92
+     "items": {
93
+      "$ref": "AclRule"
94
+     }
95
+    },
96
+    "kind": {
97
+     "type": "string",
98
+     "description": "Type of the collection (\"calendar#acl\").",
99
+     "default": "calendar#acl"
100
+    },
101
+    "nextPageToken": {
102
+     "type": "string",
103
+     "description": "Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided."
104
+    },
105
+    "nextSyncToken": {
106
+     "type": "string",
107
+     "description": "Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided."
108
+    }
109
+   }
110
+  },
111
+  "AclRule": {
112
+   "id": "AclRule",
113
+   "type": "object",
114
+   "properties": {
115
+    "etag": {
116
+     "type": "string",
117
+     "description": "ETag of the resource."
118
+    },
119
+    "id": {
120
+     "type": "string",
121
+     "description": "Identifier of the ACL rule."
122
+    },
123
+    "kind": {
124
+     "type": "string",
125
+     "description": "Type of the resource (\"calendar#aclRule\").",
126
+     "default": "calendar#aclRule"
127
+    },
128
+    "role": {
129
+     "type": "string",
130
+     "description": "The role assigned to the scope. Possible values are:  \n- \"none\" - Provides no access. \n- \"freeBusyReader\" - Provides read access to free/busy information. \n- \"reader\" - Provides read access to the calendar. Private events will appear to users with reader access, but event details will be hidden. \n- \"writer\" - Provides read and write access to the calendar. Private events will appear to users with writer access, and event details will be visible. \n- \"owner\" - Provides ownership of the calendar. This role has all of the permissions of the writer role with the additional ability to see and manipulate ACLs.",
131
+     "annotations": {
132
+      "required": [
133
+       "calendar.acl.insert"
134
+      ]
135
+     }
136
+    },
137
+    "scope": {
138
+     "type": "object",
139
+     "description": "The scope of the rule.",
140
+     "properties": {
141
+      "type": {
142
+       "type": "string",
143
+       "description": "The type of the scope. Possible values are:  \n- \"default\" - The public scope. This is the default value. \n- \"user\" - Limits the scope to a single user. \n- \"group\" - Limits the scope to a group. \n- \"domain\" - Limits the scope to a domain.  Note: The permissions granted to the \"default\", or public, scope apply to any user, authenticated or not.",
144
+       "annotations": {
145
+        "required": [
146
+         "calendar.acl.insert"
147
+        ]
148
+       }
149
+      },
150
+      "value": {
151
+       "type": "string",
152
+       "description": "The email address of a user or group, or the name of a domain, depending on the scope type. Omitted for type \"default\"."
153
+      }
154
+     },
155
+     "annotations": {
156
+      "required": [
157
+       "calendar.acl.insert"
158
+      ]
159
+     }
160
+    }
161
+   }
162
+  },
163
+  "Calendar": {
164
+   "id": "Calendar",
165
+   "type": "object",
166
+   "properties": {
167
+    "description": {
168
+     "type": "string",
169
+     "description": "Description of the calendar. Optional."
170
+    },
171
+    "etag": {
172
+     "type": "string",
173
+     "description": "ETag of the resource."
174
+    },
175
+    "id": {
176
+     "type": "string",
177
+     "description": "Identifier of the calendar."
178
+    },
179
+    "kind": {
180
+     "type": "string",
181
+     "description": "Type of the resource (\"calendar#calendar\").",
182
+     "default": "calendar#calendar"
183
+    },
184
+    "location": {
185
+     "type": "string",
186
+     "description": "Geographic location of the calendar as free-form text. Optional."
187
+    },
188
+    "summary": {
189
+     "type": "string",
190
+     "description": "Title of the calendar.",
191
+     "annotations": {
192
+      "required": [
193
+       "calendar.calendars.insert"
194
+      ]
195
+     }
196
+    },
197
+    "timeZone": {
198
+     "type": "string",
199
+     "description": "The time zone of the calendar. Optional."
200
+    }
201
+   }
202
+  },
203
+  "CalendarList": {
204
+   "id": "CalendarList",
205
+   "type": "object",
206
+   "properties": {
207
+    "etag": {
208
+     "type": "string",
209
+     "description": "ETag of the collection."
210
+    },
211
+    "items": {
212
+     "type": "array",
213
+     "description": "Calendars that are present on the user's calendar list.",
214
+     "items": {
215
+      "$ref": "CalendarListEntry"
216
+     }
217
+    },
218
+    "kind": {
219
+     "type": "string",
220
+     "description": "Type of the collection (\"calendar#calendarList\").",
221
+     "default": "calendar#calendarList"
222
+    },
223
+    "nextPageToken": {
224
+     "type": "string",
225
+     "description": "Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided."
226
+    },
227
+    "nextSyncToken": {
228
+     "type": "string",
229
+     "description": "Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided."
230
+    }
231
+   }
232
+  },
233
+  "CalendarListEntry": {
234
+   "id": "CalendarListEntry",
235
+   "type": "object",
236
+   "properties": {
237
+    "accessRole": {
238
+     "type": "string",
239
+     "description": "The effective access role that the authenticated user has on the calendar. Read-only. Possible values are:  \n- \"freeBusyReader\" - Provides read access to free/busy information. \n- \"reader\" - Provides read access to the calendar. Private events will appear to users with reader access, but event details will be hidden. \n- \"writer\" - Provides read and write access to the calendar. Private events will appear to users with writer access, and event details will be visible. \n- \"owner\" - Provides ownership of the calendar. This role has all of the permissions of the writer role with the additional ability to see and manipulate ACLs."
240
+    },
241
+    "backgroundColor": {
242
+     "type": "string",
243
+     "description": "The main color of the calendar in the hexadecimal format \"#0088aa\". This property supersedes the index-based colorId property. Optional."
244
+    },
245
+    "colorId": {
246
+     "type": "string",
247
+     "description": "The color of the calendar. This is an ID referring to an entry in the calendar section of the colors definition (see the colors endpoint). Optional."
248
+    },
249
+    "defaultReminders": {
250
+     "type": "array",
251
+     "description": "The default reminders that the authenticated user has for this calendar.",
252
+     "items": {
253
+      "$ref": "EventReminder"
254
+     }
255
+    },
256
+    "deleted": {
257
+     "type": "boolean",
258
+     "description": "Whether this calendar list entry has been deleted from the calendar list. Read-only. Optional. The default is False.",
259
+     "default": "false"
260
+    },
261
+    "description": {
262
+     "type": "string",
263
+     "description": "Description of the calendar. Optional. Read-only."
264
+    },
265
+    "etag": {
266
+     "type": "string",
267
+     "description": "ETag of the resource."
268
+    },
269
+    "foregroundColor": {
270
+     "type": "string",
271
+     "description": "The foreground color of the calendar in the hexadecimal format \"#ffffff\". This property supersedes the index-based colorId property. Optional."
272
+    },
273
+    "hidden": {
274
+     "type": "boolean",
275
+     "description": "Whether the calendar has been hidden from the list. Optional. The default is False.",
276
+     "default": "false"
277
+    },
278
+    "id": {
279
+     "type": "string",
280
+     "description": "Identifier of the calendar.",
281
+     "annotations": {
282
+      "required": [
283
+       "calendar.calendarList.insert"
284
+      ]
285
+     }
286
+    },
287
+    "kind": {
288
+     "type": "string",
289
+     "description": "Type of the resource (\"calendar#calendarListEntry\").",
290
+     "default": "calendar#calendarListEntry"
291
+    },
292
+    "location": {
293
+     "type": "string",
294
+     "description": "Geographic location of the calendar as free-form text. Optional. Read-only."
295
+    },
296
+    "notificationSettings": {
297
+     "type": "object",
298
+     "description": "The notifications that the authenticated user is receiving for this calendar.",
299
+     "properties": {
300
+      "notifications": {
301
+       "type": "array",
302
+       "description": "The list of notifications set for this calendar.",
303
+       "items": {
304
+        "$ref": "CalendarNotification"
305
+       }
306
+      }
307
+     }
308
+    },
309
+    "primary": {
310
+     "type": "boolean",
311
+     "description": "Whether the calendar is the primary calendar of the authenticated user. Read-only. Optional. The default is False.",
312
+     "default": "false"
313
+    },
314
+    "selected": {
315
+     "type": "boolean",
316
+     "description": "Whether the calendar content shows up in the calendar UI. Optional. The default is False.",
317
+     "default": "false"
318
+    },
319
+    "summary": {
320
+     "type": "string",
321
+     "description": "Title of the calendar. Read-only."
322
+    },
323
+    "summaryOverride": {
324
+     "type": "string",
325
+     "description": "The summary that the authenticated user has set for this calendar. Optional."
326
+    },
327
+    "timeZone": {
328
+     "type": "string",
329
+     "description": "The time zone of the calendar. Optional. Read-only."
330
+    }
331
+   }
332
+  },
333
+  "CalendarNotification": {
334
+   "id": "CalendarNotification",
335
+   "type": "object",
336
+   "properties": {
337
+    "method": {
338
+     "type": "string",
339
+     "description": "The method used to deliver the notification. Possible values are:  \n- \"email\" - Reminders are sent via email. \n- \"sms\" - Reminders are sent via SMS. This value is read-only and is ignored on inserts and updates.",
340
+     "annotations": {
341
+      "required": [
342
+       "calendar.calendarList.insert",
343
+       "calendar.calendarList.update"
344
+      ]
345
+     }
346
+    },
347
+    "type": {
348
+     "type": "string",
349
+     "description": "The type of notification. Possible values are:  \n- \"eventCreation\" - Notification sent when a new event is put on the calendar. \n- \"eventChange\" - Notification sent when an event is changed. \n- \"eventCancellation\" - Notification sent when an event is cancelled. \n- \"eventResponse\" - Notification sent when an event is changed. \n- \"agenda\" - An agenda with the events of the day (sent out in the morning).",
350
+     "annotations": {
351
+      "required": [
352
+       "calendar.calendarList.insert",
353
+       "calendar.calendarList.update"
354
+      ]
355
+     }
356
+    }
357
+   }
358
+  },
359
+  "Channel": {
360
+   "id": "Channel",
361
+   "type": "object",
362
+   "properties": {
363
+    "address": {
364
+     "type": "string",
365
+     "description": "The address where notifications are delivered for this channel."
366
+    },
367
+    "expiration": {
368
+     "type": "string",
369
+     "description": "Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.",
370
+     "format": "int64"
371
+    },
372
+    "id": {
373
+     "type": "string",
374
+     "description": "A UUID or similar unique string that identifies this channel."
375
+    },
376
+    "kind": {
377
+     "type": "string",
378
+     "description": "Identifies this as a notification channel used to watch for changes to a resource. Value: the fixed string \"api#channel\".",
379
+     "default": "api#channel"
380
+    },
381
+    "params": {
382
+     "type": "object",
383
+     "description": "Additional parameters controlling delivery channel behavior. Optional.",
384
+     "additionalProperties": {
385
+      "type": "string",
386
+      "description": "Declares a new parameter by name."
387
+     }
388
+    },
389
+    "payload": {
390
+     "type": "boolean",
391
+     "description": "A Boolean value to indicate whether payload is wanted. Optional."
392
+    },
393
+    "resourceId": {
394
+     "type": "string",
395
+     "description": "An opaque ID that identifies the resource being watched on this channel. Stable across different API versions."
396
+    },
397
+    "resourceUri": {
398
+     "type": "string",
399
+     "description": "A version-specific identifier for the watched resource."
400
+    },
401
+    "token": {
402
+     "type": "string",
403
+     "description": "An arbitrary string delivered to the target address with each notification delivered over this channel. Optional."
404
+    },
405
+    "type": {
406
+     "type": "string",
407
+     "description": "The type of delivery mechanism used for this channel."
408
+    }
409
+   }
410
+  },
411
+  "ColorDefinition": {
412
+   "id": "ColorDefinition",
413
+   "type": "object",
414
+   "properties": {
415
+    "background": {
416
+     "type": "string",
417
+     "description": "The background color associated with this color definition."
418
+    },
419
+    "foreground": {
420
+     "type": "string",
421
+     "description": "The foreground color that can be used to write on top of a background with 'background' color."
422
+    }
423
+   }
424
+  },
425
+  "Colors": {
426
+   "id": "Colors",
427
+   "type": "object",
428
+   "properties": {
429
+    "calendar": {
430
+     "type": "object",
431
+     "description": "Palette of calendar colors, mapping from the color ID to its definition. A calendarListEntry resource refers to one of these color IDs in its color field. Read-only.",
432
+     "additionalProperties": {
433
+      "$ref": "ColorDefinition",
434
+      "description": "A calendar color defintion."
435
+     }
436
+    },
437
+    "event": {
438
+     "type": "object",
439
+     "description": "Palette of event colors, mapping from the color ID to its definition. An event resource may refer to one of these color IDs in its color field. Read-only.",
440
+     "additionalProperties": {
441
+      "$ref": "ColorDefinition",
442
+      "description": "An event color definition."
443
+     }
444
+    },
445
+    "kind": {
446
+     "type": "string",
447
+     "description": "Type of the resource (\"calendar#colors\").",
448
+     "default": "calendar#colors"
449
+    },
450
+    "updated": {
451
+     "type": "string",
452
+     "description": "Last modification time of the color palette (as a RFC 3339 timestamp). Read-only.",
453
+     "format": "date-time"
454
+    }
455
+   }
456
+  },
457
+  "Error": {
458
+   "id": "Error",
459
+   "type": "object",
460
+   "properties": {
461
+    "domain": {
462
+     "type": "string",
463
+     "description": "Domain, or broad category, of the error."
464
+    },
465
+    "reason": {
466
+     "type": "string",
467
+     "description": "Specific reason for the error. Some of the possible values are:  \n- \"groupTooBig\" - The group of users requested is too large for a single query. \n- \"tooManyCalendarsRequested\" - The number of calendars requested is too large for a single query. \n- \"notFound\" - The requested resource was not found. \n- \"internalError\" - The API service has encountered an internal error.  Additional error types may be added in the future, so clients should gracefully handle additional error statuses not included in this list."
468
+    }
469
+   }
470
+  },
471
+  "Event": {
472
+   "id": "Event",
473
+   "type": "object",
474
+   "properties": {
475
+    "anyoneCanAddSelf": {
476
+     "type": "boolean",
477
+     "description": "Whether anyone can invite themselves to the event. Optional. The default is False.",
478
+     "default": "false"
479
+    },
480
+    "attendees": {
481
+     "type": "array",
482
+     "description": "The attendees of the event.",
483
+     "items": {
484
+      "$ref": "EventAttendee"
485
+     }
486
+    },
487
+    "attendeesOmitted": {
488
+     "type": "boolean",
489
+     "description": "Whether attendees may have been omitted from the event's representation. When retrieving an event, this may be due to a restriction specified by the maxAttendee query parameter. When updating an event, this can be used to only update the participant's response. Optional. The default is False.",
490
+     "default": "false"
491
+    },
492
+    "colorId": {
493
+     "type": "string",
494
+     "description": "The color of the event. This is an ID referring to an entry in the event section of the colors definition (see the  colors endpoint). Optional."
495
+    },
496
+    "created": {
497
+     "type": "string",
498
+     "description": "Creation time of the event (as a RFC 3339 timestamp). Read-only.",
499
+     "format": "date-time"
500
+    },
501
+    "creator": {
502
+     "type": "object",
503
+     "description": "The creator of the event. Read-only.",
504
+     "properties": {
505
+      "displayName": {
506
+       "type": "string",
507
+       "description": "The creator's name, if available."
508
+      },
509
+      "email": {
510
+       "type": "string",
511
+       "description": "The creator's email address, if available."
512
+      },
513
+      "id": {
514
+       "type": "string",
515
+       "description": "The creator's Profile ID, if available."
516
+      },
517
+      "self": {
518
+       "type": "boolean",
519
+       "description": "Whether the creator corresponds to the calendar on which this copy of the event appears. Read-only. The default is False.",
520
+       "default": "false"
521
+      }
522
+     }
523
+    },
524
+    "description": {
525
+     "type": "string",
526
+     "description": "Description of the event. Optional."
527
+    },
528
+    "end": {
529
+     "$ref": "EventDateTime",
530
+     "description": "The (exclusive) end time of the event. For a recurring event, this is the end time of the first instance.",
531
+     "annotations": {
532
+      "required": [
533
+       "calendar.events.import",
534
+       "calendar.events.insert",
535
+       "calendar.events.update"
536
+      ]
537
+     }
538
+    },
539
+    "endTimeUnspecified": {
540
+     "type": "boolean",
541
+     "description": "Whether the end time is actually unspecified. An end time is still provided for compatibility reasons, even if this attribute is set to True. The default is False.",
542
+     "default": "false"
543
+    },
544
+    "etag": {
545
+     "type": "string",
546
+     "description": "ETag of the resource."
547
+    },
548
+    "extendedProperties": {
549
+     "type": "object",
550
+     "description": "Extended properties of the event.",
551
+     "properties": {
552
+      "private": {
553
+       "type": "object",
554
+       "description": "Properties that are private to the copy of the event that appears on this calendar.",
555
+       "additionalProperties": {
556
+        "type": "string",
557
+        "description": "The name of the private property and the corresponding value."
558
+       }
559
+      },
560
+      "shared": {
561
+       "type": "object",
562
+       "description": "Properties that are shared between copies of the event on other attendees' calendars.",
563
+       "additionalProperties": {
564
+        "type": "string",
565
+        "description": "The name of the shared property and the corresponding value."
566
+       }
567
+      }
568
+     }
569
+    },
570
+    "gadget": {
571
+     "type": "object",
572
+     "description": "A gadget that extends this event.",
573
+     "properties": {
574
+      "display": {
575
+       "type": "string",
576
+       "description": "The gadget's display mode. Optional. Possible values are:  \n- \"icon\" - The gadget displays next to the event's title in the calendar view. \n- \"chip\" - The gadget displays when the event is clicked."
577
+      },
578
+      "height": {
579
+       "type": "integer",
580
+       "description": "The gadget's height in pixels. Optional.",
581
+       "format": "int32"
582
+      },
583
+      "iconLink": {
584
+       "type": "string",
585
+       "description": "The gadget's icon URL."
586
+      },
587
+      "link": {
588
+       "type": "string",
589
+       "description": "The gadget's URL."
590
+      },
591
+      "preferences": {
592
+       "type": "object",
593
+       "description": "Preferences.",
594
+       "additionalProperties": {
595
+        "type": "string",
596
+        "description": "The preference name and corresponding value."
597
+       }
598
+      },
599
+      "title": {
600
+       "type": "string",
601
+       "description": "The gadget's title."
602
+      },
603
+      "type": {
604
+       "type": "string",
605
+       "description": "The gadget's type."
606
+      },
607
+      "width": {
608
+       "type": "integer",
609
+       "description": "The gadget's width in pixels. Optional.",
610
+       "format": "int32"
611
+      }
612
+     }
613
+    },
614
+    "guestsCanInviteOthers": {
615
+     "type": "boolean",
616
+     "description": "Whether attendees other than the organizer can invite others to the event. Optional. The default is True.",
617
+     "default": "true"
618
+    },
619
+    "guestsCanModify": {
620
+     "type": "boolean",
621
+     "description": "Whether attendees other than the organizer can modify the event. Optional. The default is False.",
622
+     "default": "false"
623
+    },
624
+    "guestsCanSeeOtherGuests": {
625
+     "type": "boolean",
626
+     "description": "Whether attendees other than the organizer can see who the event's attendees are. Optional. The default is True.",
627
+     "default": "true"
628
+    },
629
+    "hangoutLink": {
630
+     "type": "string",
631
+     "description": "An absolute link to the Google+ hangout associated with this event. Read-only."
632
+    },
633
+    "htmlLink": {
634
+     "type": "string",
635
+     "description": "An absolute link to this event in the Google Calendar Web UI. Read-only."
636
+    },
637
+    "iCalUID": {
638
+     "type": "string",
639
+     "description": "Event ID in the iCalendar format.",
640
+     "annotations": {
641
+      "required": [
642
+       "calendar.events.import"
643
+      ]
644
+     }
645
+    },
646
+    "id": {
647
+     "type": "string",
648
+     "description": "Identifier of the event. When creating new single or recurring events, you can specify their IDs. Provided IDs must follow these rules:  \n- characters allowed in the ID are those used in base32hex encoding, i.e. lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 \n- the length of the ID must be between 5 and 1024 characters \n- the ID must be unique per calendar  Due to the globally distributed nature of the system, we cannot guarantee that ID collisions will be detected at event creation time. To minimize the risk of collisions we recommend using an established UUID algorithm such as one described in RFC4122."
649
+    },
650
+    "kind": {
651
+     "type": "string",
652
+     "description": "Type of the resource (\"calendar#event\").",
653
+     "default": "calendar#event"
654
+    },
655
+    "location": {
656
+     "type": "string",
657
+     "description": "Geographic location of the event as free-form text. Optional."
658
+    },
659
+    "locked": {
660
+     "type": "boolean",
661
+     "description": "Whether this is a locked event copy where no changes can be made to the main event fields \"summary\", \"description\", \"location\", \"start\", \"end\" or \"recurrence\". The default is False. Read-Only.",
662
+     "default": "false"
663
+    },
664
+    "organizer": {
665
+     "type": "object",
666
+     "description": "The organizer of the event. If the organizer is also an attendee, this is indicated with a separate entry in attendees with the organizer field set to True. To change the organizer, use the move operation. Read-only, except when importing an event.",
667
+     "properties": {
668
+      "displayName": {
669
+       "type": "string",
670
+       "description": "The organizer's name, if available."
671
+      },
672
+      "email": {
673
+       "type": "string",
674
+       "description": "The organizer's email address, if available."
675
+      },
676
+      "id": {
677
+       "type": "string",
678
+       "description": "The organizer's Profile ID, if available."
679
+      },
680
+      "self": {
681
+       "type": "boolean",
682
+       "description": "Whether the organizer corresponds to the calendar on which this copy of the event appears. Read-only. The default is False.",
683
+       "default": "false"
684
+      }
685
+     }
686
+    },
687
+    "originalStartTime": {
688
+     "$ref": "EventDateTime",
689
+     "description": "For an instance of a recurring event, this is the time at which this event would start according to the recurrence data in the recurring event identified by recurringEventId. Immutable."
690
+    },
691
+    "privateCopy": {
692
+     "type": "boolean",
693
+     "description": "Whether this is a private event copy where changes are not shared with other copies on other calendars. Optional. Immutable. The default is False.",
694
+     "default": "false"
695
+    },
696
+    "recurrence": {
697
+     "type": "array",
698
+     "description": "List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event. This field is omitted for single events or instances of recurring events.",
699
+     "items": {
700
+      "type": "string"
701
+     }
702
+    },
703
+    "recurringEventId": {
704
+     "type": "string",
705
+     "description": "For an instance of a recurring event, this is the event ID of the recurring event itself. Immutable."
706
+    },
707
+    "reminders": {
708
+     "type": "object",
709
+     "description": "Information about the event's reminders for the authenticated user.",
710
+     "properties": {
711
+      "overrides": {
712
+       "type": "array",
713
+       "description": "If the event doesn't use the default reminders, this lists the reminders specific to the event, or, if not set, indicates that no reminders are set for this event.",
714
+       "items": {
715
+        "$ref": "EventReminder"
716
+       }
717
+      },
718
+      "useDefault": {
719
+       "type": "boolean",
720
+       "description": "Whether the default reminders of the calendar apply to the event."
721
+      }
722
+     }
723
+    },
724
+    "sequence": {
725
+     "type": "integer",
726
+     "description": "Sequence number as per iCalendar.",
727
+     "format": "int32"
728
+    },
729
+    "source": {
730
+     "type": "object",
731
+     "description": "Source of an event from which it was created; for example a web page, an email message or any document identifiable by an URL using HTTP/HTTPS protocol. Accessible only by the creator of the event.",
732
+     "properties": {
733
+      "title": {
734
+       "type": "string",
735
+       "description": "Title of the source; for example a title of a web page or an email subject."
736
+      },
737
+      "url": {
738
+       "type": "string",
739
+       "description": "URL of the source pointing to a resource. URL's protocol must be HTTP or HTTPS."
740
+      }
741
+     }
742
+    },
743
+    "start": {
744
+     "$ref": "EventDateTime",
745
+     "description": "The (inclusive) start time of the event. For a recurring event, this is the start time of the first instance.",
746
+     "annotations": {
747
+      "required": [
748
+       "calendar.events.import",
749
+       "calendar.events.insert",
750
+       "calendar.events.update"
751
+      ]
752
+     }
753
+    },
754
+    "status": {
755
+     "type": "string",
756
+     "description": "Status of the event. Optional. Possible values are:  \n- \"confirmed\" - The event is confirmed. This is the default status. \n- \"tentative\" - The event is tentatively confirmed. \n- \"cancelled\" - The event is cancelled."
757
+    },
758
+    "summary": {
759
+     "type": "string",
760
+     "description": "Title of the event."
761
+    },
762
+    "transparency": {
763
+     "type": "string",
764
+     "description": "Whether the event blocks time on the calendar. Optional. Possible values are:  \n- \"opaque\" - The event blocks time on the calendar. This is the default value. \n- \"transparent\" - The event does not block time on the calendar.",
765
+     "default": "opaque"
766
+    },
767
+    "updated": {
768
+     "type": "string",
769
+     "description": "Last modification time of the event (as a RFC 3339 timestamp). Read-only.",
770
+     "format": "date-time"
771
+    },
772
+    "visibility": {
773
+     "type": "string",
774
+     "description": "Visibility of the event. Optional. Possible values are:  \n- \"default\" - Uses the default visibility for events on the calendar. This is the default value. \n- \"public\" - The event is public and event details are visible to all readers of the calendar. \n- \"private\" - The event is private and only event attendees may view event details. \n- \"confidential\" - The event is private. This value is provided for compatibility reasons.",
775
+     "default": "default"
776
+    }
777
+   }
778
+  },
779
+  "EventAttendee": {
780
+   "id": "EventAttendee",
781
+   "type": "object",
782
+   "properties": {
783
+    "additionalGuests": {
784
+     "type": "integer",
785
+     "description": "Number of additional guests. Optional. The default is 0.",
786
+     "format": "int32"
787
+    },
788
+    "comment": {
789
+     "type": "string",
790
+     "description": "The attendee's response comment. Optional."
791
+    },
792
+    "displayName": {
793
+     "type": "string",
794
+     "description": "The attendee's name, if available. Optional."
795
+    },
796
+    "email": {
797
+     "type": "string",
798
+     "description": "The attendee's email address, if available. This field must be present when adding an attendee.",
799
+     "annotations": {
800
+      "required": [
801
+       "calendar.events.import",
802
+       "calendar.events.insert",
803
+       "calendar.events.update"
804
+      ]
805
+     }
806
+    },
807
+    "id": {
808
+     "type": "string",
809
+     "description": "The attendee's Profile ID, if available."
810
+    },
811
+    "optional": {
812
+     "type": "boolean",
813
+     "description": "Whether this is an optional attendee. Optional. The default is False."
814
+    },
815
+    "organizer": {
816
+     "type": "boolean",
817
+     "description": "Whether the attendee is the organizer of the event. Read-only. The default is False."
818
+    },
819
+    "resource": {
820
+     "type": "boolean",
821
+     "description": "Whether the attendee is a resource. Read-only. The default is False."
822
+    },
823
+    "responseStatus": {
824
+     "type": "string",
825
+     "description": "The attendee's response status. Possible values are:  \n- \"needsAction\" - The attendee has not responded to the invitation. \n- \"declined\" - The attendee has declined the invitation. \n- \"tentative\" - The attendee has tentatively accepted the invitation. \n- \"accepted\" - The attendee has accepted the invitation."
826
+    },
827
+    "self": {
828
+     "type": "boolean",
829
+     "description": "Whether this entry represents the calendar on which this copy of the event appears. Read-only. The default is False."
830
+    }
831
+   }
832
+  },
833
+  "EventDateTime": {
834
+   "id": "EventDateTime",
835
+   "type": "object",
836
+   "properties": {
837
+    "date": {
838
+     "type": "string",
839
+     "description": "The date, in the format \"yyyy-mm-dd\", if this is an all-day event.",
840
+     "format": "date"
841
+    },
842
+    "dateTime": {
843
+     "type": "string",
844
+     "description": "The time, as a combined date-time value (formatted according to RFC 3339). A time zone offset is required unless a time zone is explicitly specified in timeZone.",
845
+     "format": "date-time"
846
+    },
847
+    "timeZone": {
848
+     "type": "string",
849
+     "description": "The name of the time zone in which the time is specified (e.g. \"Europe/Zurich\"). Optional. The default is the time zone of the calendar."
850
+    }
851
+   }
852
+  },
853
+  "EventReminder": {
854
+   "id": "EventReminder",
855
+   "type": "object",
856
+   "properties": {
857
+    "method": {
858
+     "type": "string",
859
+     "description": "The method used by this reminder. Possible values are:  \n- \"email\" - Reminders are sent via email. \n- \"sms\" - Reminders are sent via SMS. \n- \"popup\" - Reminders are sent via a UI popup.",
860
+     "annotations": {
861
+      "required": [
862
+       "calendar.calendarList.insert",
863
+       "calendar.calendarList.update",
864
+       "calendar.events.import",
865
+       "calendar.events.insert",
866
+       "calendar.events.update"
867
+      ]
868
+     }
869
+    },
870
+    "minutes": {
871
+     "type": "integer",
872
+     "description": "Number of minutes before the start of the event when the reminder should trigger.",
873
+     "format": "int32",
874
+     "annotations": {
875
+      "required": [
876
+       "calendar.calendarList.insert",
877
+       "calendar.calendarList.update",
878
+       "calendar.events.import",
879
+       "calendar.events.insert",
880
+       "calendar.events.update"
881
+      ]
882
+     }
883
+    }
884
+   }
885
+  },
886
+  "Events": {
887
+   "id": "Events",
888
+   "type": "object",
889
+   "properties": {
890
+    "accessRole": {
891
+     "type": "string",
892
+     "description": "The user's access role for this calendar. Read-only. Possible values are:  \n- \"none\" - The user has no access. \n- \"freeBusyReader\" - The user has read access to free/busy information. \n- \"reader\" - The user has read access to the calendar. Private events will appear to users with reader access, but event details will be hidden. \n- \"writer\" - The user has read and write access to the calendar. Private events will appear to users with writer access, and event details will be visible. \n- \"owner\" - The user has ownership of the calendar. This role has all of the permissions of the writer role with the additional ability to see and manipulate ACLs."
893
+    },
894
+    "defaultReminders": {
895
+     "type": "array",
896
+     "description": "The default reminders on the calendar for the authenticated user. These reminders apply to all events on this calendar that do not explicitly override them (i.e. do not have reminders.useDefault set to True).",
897
+     "items": {
898
+      "$ref": "EventReminder"
899
+     }
900
+    },
901
+    "description": {
902
+     "type": "string",
903
+     "description": "Description of the calendar. Read-only."
904
+    },
905
+    "etag": {
906
+     "type": "string",
907
+     "description": "ETag of the collection."
908
+    },
909
+    "items": {
910
+     "type": "array",
911
+     "description": "List of events on the calendar.",
912
+     "items": {
913
+      "$ref": "Event"
914
+     }
915
+    },
916
+    "kind": {
917
+     "type": "string",
918
+     "description": "Type of the collection (\"calendar#events\").",
919
+     "default": "calendar#events"
920
+    },
921
+    "nextPageToken": {
922
+     "type": "string",
923
+     "description": "Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided."
924
+    },
925
+    "nextSyncToken": {
926
+     "type": "string",
927
+     "description": "Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided."
928
+    },
929
+    "summary": {
930
+     "type": "string",
931
+     "description": "Title of the calendar. Read-only."
932
+    },
933
+    "timeZone": {
934
+     "type": "string",
935
+     "description": "The time zone of the calendar. Read-only."
936
+    },
937
+    "updated": {
938
+     "type": "string",
939
+     "description": "Last modification time of the calendar (as a RFC 3339 timestamp). Read-only.",
940
+     "format": "date-time"
941
+    }
942
+   }
943
+  },
944
+  "FreeBusyCalendar": {
945
+   "id": "FreeBusyCalendar",
946
+   "type": "object",
947
+   "properties": {
948
+    "busy": {
949
+     "type": "array",
950
+     "description": "List of time ranges during which this calendar should be regarded as busy.",
951
+     "items": {
952
+      "$ref": "TimePeriod"
953
+     }
954
+    },
955
+    "errors": {
956
+     "type": "array",
957
+     "description": "Optional error(s) (if computation for the calendar failed).",
958
+     "items": {
959
+      "$ref": "Error"
960
+     }
961
+    }
962
+   }
963
+  },
964
+  "FreeBusyGroup": {
965
+   "id": "FreeBusyGroup",
966
+   "type": "object",
967
+   "properties": {
968
+    "calendars": {
969
+     "type": "array",
970
+     "description": "List of calendars' identifiers within a group.",
971
+     "items": {
972
+      "type": "string"
973
+     }
974
+    },
975
+    "errors": {
976
+     "type": "array",
977
+     "description": "Optional error(s) (if computation for the group failed).",
978
+     "items": {
979
+      "$ref": "Error"
980
+     }
981
+    }
982
+   }
983
+  },
984
+  "FreeBusyRequest": {
985
+   "id": "FreeBusyRequest",
986
+   "type": "object",
987
+   "properties": {
988
+    "calendarExpansionMax": {
989
+     "type": "integer",
990
+     "description": "Maximal number of calendars for which FreeBusy information is to be provided. Optional.",
991
+     "format": "int32"
992
+    },
993
+    "groupExpansionMax": {
994
+     "type": "integer",
995
+     "description": "Maximal number of calendar identifiers to be provided for a single group. Optional. An error will be returned for a group with more members than this value.",
996
+     "format": "int32"
997
+    },
998
+    "items": {
999
+     "type": "array",
1000
+     "description": "List of calendars and/or groups to query.",
1001
+     "items": {
1002
+      "$ref": "FreeBusyRequestItem"
1003
+     }
1004
+    },
1005
+    "timeMax": {
1006
+     "type": "string",
1007
+     "description": "The end of the interval for the query.",
1008
+     "format": "date-time"
1009
+    },
1010
+    "timeMin": {
1011
+     "type": "string",
1012
+     "description": "The start of the interval for the query.",
1013
+     "format": "date-time"
1014
+    },
1015
+    "timeZone": {
1016
+     "type": "string",
1017
+     "description": "Time zone used in the response. Optional. The default is UTC.",
1018
+     "default": "UTC"
1019
+    }
1020
+   }
1021
+  },
1022
+  "FreeBusyRequestItem": {
1023
+   "id": "FreeBusyRequestItem",
1024
+   "type": "object",
1025
+   "properties": {
1026
+    "id": {
1027
+     "type": "string",
1028
+     "description": "The identifier of a calendar or a group."
1029
+    }
1030
+   }
1031
+  },
1032
+  "FreeBusyResponse": {
1033
+   "id": "FreeBusyResponse",
1034
+   "type": "object",
1035
+   "properties": {
1036
+    "calendars": {
1037
+     "type": "object",
1038
+     "description": "List of free/busy information for calendars.",
1039
+     "additionalProperties": {
1040
+      "$ref": "FreeBusyCalendar",
1041
+      "description": "Free/busy expansions for a single calendar."
1042
+     }
1043
+    },
1044
+    "groups": {
1045
+     "type": "object",
1046
+     "description": "Expansion of groups.",
1047
+     "additionalProperties": {
1048
+      "$ref": "FreeBusyGroup",
1049
+      "description": "List of calendars that are members of this group."
1050
+     }
1051
+    },
1052
+    "kind": {
1053
+     "type": "string",
1054
+     "description": "Type of the resource (\"calendar#freeBusy\").",
1055
+     "default": "calendar#freeBusy"
1056
+    },
1057
+    "timeMax": {
1058
+     "type": "string",
1059
+     "description": "The end of the interval.",
1060
+     "format": "date-time"
1061
+    },
1062
+    "timeMin": {
1063
+     "type": "string",
1064
+     "description": "The start of the interval.",
1065
+     "format": "date-time"
1066
+    }
1067
+   }
1068
+  },
1069
+  "Setting": {
1070
+   "id": "Setting",
1071
+   "type": "object",
1072
+   "properties": {
1073
+    "etag": {
1074
+     "type": "string",
1075
+     "description": "ETag of the resource."
1076
+    },
1077
+    "id": {
1078
+     "type": "string",
1079
+     "description": "The id of the user setting."
1080
+    },
1081
+    "kind": {
1082
+     "type": "string",
1083
+     "description": "Type of the resource (\"calendar#setting\").",
1084
+     "default": "calendar#setting"
1085
+    },
1086
+    "value": {
1087
+     "type": "string",
1088
+     "description": "Value of the user setting. The format of the value depends on the ID of the setting. It must always be a UTF-8 string of length up to 1024 characters."
1089
+    }
1090
+   }
1091
+  },
1092
+  "Settings": {
1093
+   "id": "Settings",
1094
+   "type": "object",
1095
+   "properties": {
1096
+    "etag": {
1097
+     "type": "string",
1098
+     "description": "Etag of the collection."
1099
+    },
1100
+    "items": {
1101
+     "type": "array",
1102
+     "description": "List of user settings.",
1103
+     "items": {
1104
+      "$ref": "Setting"
1105
+     }
1106
+    },
1107
+    "kind": {
1108
+     "type": "string",
1109
+     "description": "Type of the collection (\"calendar#settings\").",
1110
+     "default": "calendar#settings"
1111
+    },
1112
+    "nextPageToken": {
1113
+     "type": "string",
1114
+     "description": "Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided."
1115
+    },
1116
+    "nextSyncToken": {
1117
+     "type": "string",
1118
+     "description": "Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided."
1119
+    }
1120
+   }
1121
+  },
1122
+  "TimePeriod": {
1123
+   "id": "TimePeriod",
1124
+   "type": "object",
1125
+   "properties": {
1126
+    "end": {
1127
+     "type": "string",
1128
+     "description": "The (exclusive) end of the time period.",
1129
+     "format": "date-time"
1130
+    },
1131
+    "start": {
1132
+     "type": "string",
1133
+     "description": "The (inclusive) start of the time period.",
1134
+     "format": "date-time"
1135
+    }
1136
+   }
1137
+  }
1138
+ },
1139
+ "resources": {
1140
+  "acl": {
1141
+   "methods": {
1142
+    "delete": {
1143
+     "id": "calendar.acl.delete",
1144
+     "path": "calendars/{calendarId}/acl/{ruleId}",
1145
+     "httpMethod": "DELETE",
1146
+     "description": "Deletes an access control rule.",
1147
+     "parameters": {
1148
+      "calendarId": {
1149
+       "type": "string",
1150
+       "description": "Calendar identifier.",
1151
+       "required": true,
1152
+       "location": "path"
1153
+      },
1154
+      "ruleId": {
1155
+       "type": "string",
1156
+       "description": "ACL rule identifier.",
1157
+       "required": true,
1158
+       "location": "path"
1159
+      }
1160
+     },
1161
+     "parameterOrder": [
1162
+      "calendarId",
1163
+      "ruleId"
1164
+     ],
1165
+     "scopes": [
1166
+      "https://www.googleapis.com/auth/calendar"
1167
+     ]
1168
+    },
1169
+    "get": {
1170
+     "id": "calendar.acl.get",
1171
+     "path": "calendars/{calendarId}/acl/{ruleId}",
1172
+     "httpMethod": "GET",
1173
+     "description": "Returns an access control rule.",
1174
+     "parameters": {
1175
+      "calendarId": {
1176
+       "type": "string",
1177
+       "description": "Calendar identifier.",
1178
+       "required": true,
1179
+       "location": "path"
1180
+      },
1181
+      "ruleId": {
1182
+       "type": "string",
1183
+       "description": "ACL rule identifier.",
1184
+       "required": true,
1185
+       "location": "path"
1186
+      }
1187
+     },
1188
+     "parameterOrder": [
1189
+      "calendarId",
1190
+      "ruleId"
1191
+     ],
1192
+     "response": {
1193
+      "$ref": "AclRule"
1194
+     },
1195
+     "scopes": [
1196
+      "https://www.googleapis.com/auth/calendar",
1197
+      "https://www.googleapis.com/auth/calendar.readonly"
1198
+     ]
1199
+    },
1200
+    "insert": {
1201
+     "id": "calendar.acl.insert",
1202
+     "path": "calendars/{calendarId}/acl",
1203
+     "httpMethod": "POST",
1204
+     "description": "Creates an access control rule.",
1205
+     "parameters": {
1206
+      "calendarId": {
1207
+       "type": "string",
1208
+       "description": "Calendar identifier.",
1209
+       "required": true,
1210
+       "location": "path"
1211
+      }
1212
+     },
1213
+     "parameterOrder": [
1214
+      "calendarId"
1215
+     ],
1216
+     "request": {
1217
+      "$ref": "AclRule"
1218
+     },
1219
+     "response": {
1220
+      "$ref": "AclRule"
1221
+     },
1222
+     "scopes": [
1223
+      "https://www.googleapis.com/auth/calendar"
1224
+     ]
1225
+    },
1226
+    "list": {
1227
+     "id": "calendar.acl.list",
1228
+     "path": "calendars/{calendarId}/acl",
1229
+     "httpMethod": "GET",
1230
+     "description": "Returns the rules in the access control list for the calendar.",
1231
+     "parameters": {
1232
+      "calendarId": {
1233
+       "type": "string",
1234
+       "description": "Calendar identifier.",
1235
+       "required": true,
1236
+       "location": "path"
1237
+      },
1238
+      "maxResults": {
1239
+       "type": "integer",
1240
+       "description": "Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.",
1241
+       "format": "int32",
1242
+       "minimum": "1",
1243
+       "location": "query"
1244
+      },
1245
+      "pageToken": {
1246
+       "type": "string",
1247
+       "description": "Token specifying which result page to return. Optional.",
1248
+       "location": "query"
1249
+      },
1250
+      "showDeleted": {
1251
+       "type": "boolean",
1252
+       "description": "Whether to include deleted ACLs in the result. Deleted ACLs are represented by role equal to \"none\". Deleted ACLs will always be included if syncToken is provided. Optional. The default is False.",
1253
+       "location": "query"
1254
+      },
1255
+      "syncToken": {
1256
+       "type": "string",
1257
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All entries deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.\nIf the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
1258
+       "location": "query"
1259
+      }
1260
+     },
1261
+     "parameterOrder": [
1262
+      "calendarId"
1263
+     ],
1264
+     "response": {
1265
+      "$ref": "Acl"
1266
+     },
1267
+     "scopes": [
1268
+      "https://www.googleapis.com/auth/calendar"
1269
+     ],
1270
+     "supportsSubscription": true
1271
+    },
1272
+    "patch": {
1273
+     "id": "calendar.acl.patch",
1274
+     "path": "calendars/{calendarId}/acl/{ruleId}",
1275
+     "httpMethod": "PATCH",
1276
+     "description": "Updates an access control rule. This method supports patch semantics.",
1277
+     "parameters": {
1278
+      "calendarId": {
1279
+       "type": "string",
1280
+       "description": "Calendar identifier.",
1281
+       "required": true,
1282
+       "location": "path"
1283
+      },
1284
+      "ruleId": {
1285
+       "type": "string",
1286
+       "description": "ACL rule identifier.",
1287
+       "required": true,
1288
+       "location": "path"
1289
+      }
1290
+     },
1291
+     "parameterOrder": [
1292
+      "calendarId",
1293
+      "ruleId"
1294
+     ],
1295
+     "request": {
1296
+      "$ref": "AclRule"
1297
+     },
1298
+     "response": {
1299
+      "$ref": "AclRule"
1300
+     },
1301
+     "scopes": [
1302
+      "https://www.googleapis.com/auth/calendar"
1303
+     ]
1304
+    },
1305
+    "update": {
1306
+     "id": "calendar.acl.update",
1307
+     "path": "calendars/{calendarId}/acl/{ruleId}",
1308
+     "httpMethod": "PUT",
1309
+     "description": "Updates an access control rule.",
1310
+     "parameters": {
1311
+      "calendarId": {
1312
+       "type": "string",
1313
+       "description": "Calendar identifier.",
1314
+       "required": true,
1315
+       "location": "path"
1316
+      },
1317
+      "ruleId": {
1318
+       "type": "string",
1319
+       "description": "ACL rule identifier.",
1320
+       "required": true,
1321
+       "location": "path"
1322
+      }
1323
+     },
1324
+     "parameterOrder": [
1325
+      "calendarId",
1326
+      "ruleId"
1327
+     ],
1328
+     "request": {
1329
+      "$ref": "AclRule"
1330
+     },
1331
+     "response": {
1332
+      "$ref": "AclRule"
1333
+     },
1334
+     "scopes": [
1335
+      "https://www.googleapis.com/auth/calendar"
1336
+     ]
1337
+    },
1338
+    "watch": {
1339
+     "id": "calendar.acl.watch",
1340
+     "path": "calendars/{calendarId}/acl/watch",
1341
+     "httpMethod": "POST",
1342
+     "description": "Watch for changes to ACL resources.",
1343
+     "parameters": {
1344
+      "calendarId": {
1345
+       "type": "string",
1346
+       "description": "Calendar identifier.",
1347
+       "required": true,
1348
+       "location": "path"
1349
+      },
1350
+      "maxResults": {
1351
+       "type": "integer",
1352
+       "description": "Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.",
1353
+       "format": "int32",
1354
+       "minimum": "1",
1355
+       "location": "query"
1356
+      },
1357
+      "pageToken": {
1358
+       "type": "string",
1359
+       "description": "Token specifying which result page to return. Optional.",
1360
+       "location": "query"
1361
+      },
1362
+      "showDeleted": {
1363
+       "type": "boolean",
1364
+       "description": "Whether to include deleted ACLs in the result. Deleted ACLs are represented by role equal to \"none\". Deleted ACLs will always be included if syncToken is provided. Optional. The default is False.",
1365
+       "location": "query"
1366
+      },
1367
+      "syncToken": {
1368
+       "type": "string",
1369
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All entries deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.\nIf the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
1370
+       "location": "query"
1371
+      }
1372
+     },
1373
+     "parameterOrder": [
1374
+      "calendarId"
1375
+     ],
1376
+     "request": {
1377
+      "$ref": "Channel",
1378
+      "parameterName": "resource"
1379
+     },
1380
+     "response": {
1381
+      "$ref": "Channel"
1382
+     },
1383
+     "scopes": [
1384
+      "https://www.googleapis.com/auth/calendar"
1385
+     ],
1386
+     "supportsSubscription": true
1387
+    }
1388
+   }
1389
+  },
1390
+  "calendarList": {
1391
+   "methods": {
1392
+    "delete": {
1393
+     "id": "calendar.calendarList.delete",
1394
+     "path": "users/me/calendarList/{calendarId}",
1395
+     "httpMethod": "DELETE",
1396
+     "description": "Deletes an entry on the user's calendar list.",
1397
+     "parameters": {
1398
+      "calendarId": {
1399
+       "type": "string",
1400
+       "description": "Calendar identifier.",
1401
+       "required": true,
1402
+       "location": "path"
1403
+      }
1404
+     },
1405
+     "parameterOrder": [
1406
+      "calendarId"
1407
+     ],
1408
+     "scopes": [
1409
+      "https://www.googleapis.com/auth/calendar"
1410
+     ]
1411
+    },
1412
+    "get": {
1413
+     "id": "calendar.calendarList.get",
1414
+     "path": "users/me/calendarList/{calendarId}",
1415
+     "httpMethod": "GET",
1416
+     "description": "Returns an entry on the user's calendar list.",
1417
+     "parameters": {
1418
+      "calendarId": {
1419
+       "type": "string",
1420
+       "description": "Calendar identifier.",
1421
+       "required": true,
1422
+       "location": "path"
1423
+      }
1424
+     },
1425
+     "parameterOrder": [
1426
+      "calendarId"
1427
+     ],
1428
+     "response": {
1429
+      "$ref": "CalendarListEntry"
1430
+     },
1431
+     "scopes": [
1432
+      "https://www.googleapis.com/auth/calendar",
1433
+      "https://www.googleapis.com/auth/calendar.readonly"
1434
+     ]
1435
+    },
1436
+    "insert": {
1437
+     "id": "calendar.calendarList.insert",
1438
+     "path": "users/me/calendarList",
1439
+     "httpMethod": "POST",
1440
+     "description": "Adds an entry to the user's calendar list.",
1441
+     "parameters": {
1442
+      "colorRgbFormat": {
1443
+       "type": "boolean",
1444
+       "description": "Whether to use the foregroundColor and backgroundColor fields to write the calendar colors (RGB). If this feature is used, the index-based colorId field will be set to the best matching option automatically. Optional. The default is False.",
1445
+       "location": "query"
1446
+      }
1447
+     },
1448
+     "request": {
1449
+      "$ref": "CalendarListEntry"
1450
+     },
1451
+     "response": {
1452
+      "$ref": "CalendarListEntry"
1453
+     },
1454
+     "scopes": [
1455
+      "https://www.googleapis.com/auth/calendar"
1456
+     ]
1457
+    },
1458
+    "list": {
1459
+     "id": "calendar.calendarList.list",
1460
+     "path": "users/me/calendarList",
1461
+     "httpMethod": "GET",
1462
+     "description": "Returns entries on the user's calendar list.",
1463
+     "parameters": {
1464
+      "maxResults": {
1465
+       "type": "integer",
1466
+       "description": "Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.",
1467
+       "format": "int32",
1468
+       "minimum": "1",
1469
+       "location": "query"
1470
+      },
1471
+      "minAccessRole": {
1472
+       "type": "string",
1473
+       "description": "The minimum access role for the user in the returned entires. Optional. The default is no restriction.",
1474
+       "enum": [
1475
+        "freeBusyReader",
1476
+        "owner",
1477
+        "reader",
1478
+        "writer"
1479
+       ],
1480
+       "enumDescriptions": [
1481
+        "The user can read free/busy information.",
1482
+        "The user can read and modify events and access control lists.",
1483
+        "The user can read events that are not private.",
1484
+        "The user can read and modify events."
1485
+       ],
1486
+       "location": "query"
1487
+      },
1488
+      "pageToken": {
1489
+       "type": "string",
1490
+       "description": "Token specifying which result page to return. Optional.",
1491
+       "location": "query"
1492
+      },
1493
+      "showDeleted": {
1494
+       "type": "boolean",
1495
+       "description": "Whether to include deleted calendar list entries in the result. Optional. The default is False.",
1496
+       "location": "query"
1497
+      },
1498
+      "showHidden": {
1499
+       "type": "boolean",
1500
+       "description": "Whether to show hidden entries. Optional. The default is False.",
1501
+       "location": "query"
1502
+      },
1503
+      "syncToken": {
1504
+       "type": "string",
1505
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. If only read-only fields such as calendar properties or ACLs have changed, the entry won't be returned. All entries deleted and hidden since the previous list request will always be in the result set and it is not allowed to set showDeleted neither showHidden to False.\nTo ensure client state consistency minAccessRole query parameter cannot be specified together with nextSyncToken.\nIf the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
1506
+       "location": "query"
1507
+      }
1508
+     },
1509
+     "response": {
1510
+      "$ref": "CalendarList"
1511
+     },
1512
+     "scopes": [
1513
+      "https://www.googleapis.com/auth/calendar",
1514
+      "https://www.googleapis.com/auth/calendar.readonly"
1515
+     ],
1516
+     "supportsSubscription": true
1517
+    },
1518
+    "patch": {
1519
+     "id": "calendar.calendarList.patch",
1520
+     "path": "users/me/calendarList/{calendarId}",
1521
+     "httpMethod": "PATCH",
1522
+     "description": "Updates an entry on the user's calendar list. This method supports patch semantics.",
1523
+     "parameters": {
1524
+      "calendarId": {
1525
+       "type": "string",
1526
+       "description": "Calendar identifier.",
1527
+       "required": true,
1528
+       "location": "path"
1529
+      },
1530
+      "colorRgbFormat": {
1531
+       "type": "boolean",
1532
+       "description": "Whether to use the foregroundColor and backgroundColor fields to write the calendar colors (RGB). If this feature is used, the index-based colorId field will be set to the best matching option automatically. Optional. The default is False.",
1533
+       "location": "query"
1534
+      }
1535
+     },
1536
+     "parameterOrder": [
1537
+      "calendarId"
1538
+     ],
1539
+     "request": {
1540
+      "$ref": "CalendarListEntry"
1541
+     },
1542
+     "response": {
1543
+      "$ref": "CalendarListEntry"
1544
+     },
1545
+     "scopes": [
1546
+      "https://www.googleapis.com/auth/calendar"
1547
+     ]
1548
+    },
1549
+    "update": {
1550
+     "id": "calendar.calendarList.update",
1551
+     "path": "users/me/calendarList/{calendarId}",
1552
+     "httpMethod": "PUT",
1553
+     "description": "Updates an entry on the user's calendar list.",
1554
+     "parameters": {
1555
+      "calendarId": {
1556
+       "type": "string",
1557
+       "description": "Calendar identifier.",
1558
+       "required": true,
1559
+       "location": "path"
1560
+      },
1561
+      "colorRgbFormat": {
1562
+       "type": "boolean",
1563
+       "description": "Whether to use the foregroundColor and backgroundColor fields to write the calendar colors (RGB). If this feature is used, the index-based colorId field will be set to the best matching option automatically. Optional. The default is False.",
1564
+       "location": "query"
1565
+      }
1566
+     },
1567
+     "parameterOrder": [
1568
+      "calendarId"
1569
+     ],
1570
+     "request": {
1571
+      "$ref": "CalendarListEntry"
1572
+     },
1573
+     "response": {
1574
+      "$ref": "CalendarListEntry"
1575
+     },
1576
+     "scopes": [
1577
+      "https://www.googleapis.com/auth/calendar"
1578
+     ]
1579
+    },
1580
+    "watch": {
1581
+     "id": "calendar.calendarList.watch",
1582
+     "path": "users/me/calendarList/watch",
1583
+     "httpMethod": "POST",
1584
+     "description": "Watch for changes to CalendarList resources.",
1585
+     "parameters": {
1586
+      "maxResults": {
1587
+       "type": "integer",
1588
+       "description": "Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.",
1589
+       "format": "int32",
1590
+       "minimum": "1",
1591
+       "location": "query"
1592
+      },
1593
+      "minAccessRole": {
1594
+       "type": "string",
1595
+       "description": "The minimum access role for the user in the returned entires. Optional. The default is no restriction.",
1596
+       "enum": [
1597
+        "freeBusyReader",
1598
+        "owner",
1599
+        "reader",
1600
+        "writer"
1601
+       ],
1602
+       "enumDescriptions": [
1603
+        "The user can read free/busy information.",
1604
+        "The user can read and modify events and access control lists.",
1605
+        "The user can read events that are not private.",
1606
+        "The user can read and modify events."
1607
+       ],
1608
+       "location": "query"
1609
+      },
1610
+      "pageToken": {
1611
+       "type": "string",
1612
+       "description": "Token specifying which result page to return. Optional.",
1613
+       "location": "query"
1614
+      },
1615
+      "showDeleted": {
1616
+       "type": "boolean",
1617
+       "description": "Whether to include deleted calendar list entries in the result. Optional. The default is False.",
1618
+       "location": "query"
1619
+      },
1620
+      "showHidden": {
1621
+       "type": "boolean",
1622
+       "description": "Whether to show hidden entries. Optional. The default is False.",
1623
+       "location": "query"
1624
+      },
1625
+      "syncToken": {
1626
+       "type": "string",
1627
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. If only read-only fields such as calendar properties or ACLs have changed, the entry won't be returned. All entries deleted and hidden since the previous list request will always be in the result set and it is not allowed to set showDeleted neither showHidden to False.\nTo ensure client state consistency minAccessRole query parameter cannot be specified together with nextSyncToken.\nIf the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
1628
+       "location": "query"
1629
+      }
1630
+     },
1631
+     "request": {
1632
+      "$ref": "Channel",
1633
+      "parameterName": "resource"
1634
+     },
1635
+     "response": {
1636
+      "$ref": "Channel"
1637
+     },
1638
+     "scopes": [
1639
+      "https://www.googleapis.com/auth/calendar",
1640
+      "https://www.googleapis.com/auth/calendar.readonly"
1641
+     ],
1642
+     "supportsSubscription": true
1643
+    }
1644
+   }
1645
+  },
1646
+  "calendars": {
1647
+   "methods": {
1648
+    "clear": {
1649
+     "id": "calendar.calendars.clear",
1650
+     "path": "calendars/{calendarId}/clear",
1651
+     "httpMethod": "POST",
1652
+     "description": "Clears a primary calendar. This operation deletes all data associated with the primary calendar of an account and cannot be undone.",
1653
+     "parameters": {
1654
+      "calendarId": {
1655
+       "type": "string",
1656
+       "description": "Calendar identifier.",
1657
+       "required": true,
1658
+       "location": "path"
1659
+      }
1660
+     },
1661
+     "parameterOrder": [
1662
+      "calendarId"
1663
+     ],
1664
+     "scopes": [
1665
+      "https://www.googleapis.com/auth/calendar"
1666
+     ]
1667
+    },
1668
+    "delete": {
1669
+     "id": "calendar.calendars.delete",
1670
+     "path": "calendars/{calendarId}",
1671
+     "httpMethod": "DELETE",
1672
+     "description": "Deletes a secondary calendar.",
1673
+     "parameters": {
1674
+      "calendarId": {
1675
+       "type": "string",
1676
+       "description": "Calendar identifier.",
1677
+       "required": true,
1678
+       "location": "path"
1679
+      }
1680
+     },
1681
+     "parameterOrder": [
1682
+      "calendarId"
1683
+     ],
1684
+     "scopes": [
1685
+      "https://www.googleapis.com/auth/calendar"
1686
+     ]
1687
+    },
1688
+    "get": {
1689
+     "id": "calendar.calendars.get",
1690
+     "path": "calendars/{calendarId}",
1691
+     "httpMethod": "GET",
1692
+     "description": "Returns metadata for a calendar.",
1693
+     "parameters": {
1694
+      "calendarId": {
1695
+       "type": "string",
1696
+       "description": "Calendar identifier.",
1697
+       "required": true,
1698
+       "location": "path"
1699
+      }
1700
+     },
1701
+     "parameterOrder": [
1702
+      "calendarId"
1703
+     ],
1704
+     "response": {
1705
+      "$ref": "Calendar"
1706
+     },
1707
+     "scopes": [
1708
+      "https://www.googleapis.com/auth/calendar",
1709
+      "https://www.googleapis.com/auth/calendar.readonly"
1710
+     ]
1711
+    },
1712
+    "insert": {
1713
+     "id": "calendar.calendars.insert",
1714
+     "path": "calendars",
1715
+     "httpMethod": "POST",
1716
+     "description": "Creates a secondary calendar.",
1717
+     "request": {
1718
+      "$ref": "Calendar"
1719
+     },
1720
+     "response": {
1721
+      "$ref": "Calendar"
1722
+     },
1723
+     "scopes": [
1724
+      "https://www.googleapis.com/auth/calendar"
1725
+     ]
1726
+    },
1727
+    "patch": {
1728
+     "id": "calendar.calendars.patch",
1729
+     "path": "calendars/{calendarId}",
1730
+     "httpMethod": "PATCH",
1731
+     "description": "Updates metadata for a calendar. This method supports patch semantics.",
1732
+     "parameters": {
1733
+      "calendarId": {
1734
+       "type": "string",
1735
+       "description": "Calendar identifier.",
1736
+       "required": true,
1737
+       "location": "path"
1738
+      }
1739
+     },
1740
+     "parameterOrder": [
1741
+      "calendarId"
1742
+     ],
1743
+     "request": {
1744
+      "$ref": "Calendar"
1745
+     },
1746
+     "response": {
1747
+      "$ref": "Calendar"
1748
+     },
1749
+     "scopes": [
1750
+      "https://www.googleapis.com/auth/calendar"
1751
+     ]
1752
+    },
1753
+    "update": {
1754
+     "id": "calendar.calendars.update",
1755
+     "path": "calendars/{calendarId}",
1756
+     "httpMethod": "PUT",
1757
+     "description": "Updates metadata for a calendar.",
1758
+     "parameters": {
1759
+      "calendarId": {
1760
+       "type": "string",
1761
+       "description": "Calendar identifier.",
1762
+       "required": true,
1763
+       "location": "path"
1764
+      }
1765
+     },
1766
+     "parameterOrder": [
1767
+      "calendarId"
1768
+     ],
1769
+     "request": {
1770
+      "$ref": "Calendar"
1771
+     },
1772
+     "response": {
1773
+      "$ref": "Calendar"
1774
+     },
1775
+     "scopes": [
1776
+      "https://www.googleapis.com/auth/calendar"
1777
+     ]
1778
+    }
1779
+   }
1780
+  },
1781
+  "channels": {
1782
+   "methods": {
1783
+    "stop": {
1784
+     "id": "calendar.channels.stop",
1785
+     "path": "channels/stop",
1786
+     "httpMethod": "POST",
1787
+     "description": "Stop watching resources through this channel",
1788
+     "request": {
1789
+      "$ref": "Channel",
1790
+      "parameterName": "resource"
1791
+     },
1792
+     "scopes": [
1793
+      "https://www.googleapis.com/auth/calendar",
1794
+      "https://www.googleapis.com/auth/calendar.readonly"
1795
+     ]
1796
+    }
1797
+   }
1798
+  },
1799
+  "colors": {
1800
+   "methods": {
1801
+    "get": {
1802
+     "id": "calendar.colors.get",
1803
+     "path": "colors",
1804
+     "httpMethod": "GET",
1805
+     "description": "Returns the color definitions for calendars and events.",
1806
+     "response": {
1807
+      "$ref": "Colors"
1808
+     },
1809
+     "scopes": [
1810
+      "https://www.googleapis.com/auth/calendar",
1811
+      "https://www.googleapis.com/auth/calendar.readonly"
1812
+     ]
1813
+    }
1814
+   }
1815
+  },
1816
+  "events": {
1817
+   "methods": {
1818
+    "delete": {
1819
+     "id": "calendar.events.delete",
1820
+     "path": "calendars/{calendarId}/events/{eventId}",
1821
+     "httpMethod": "DELETE",
1822
+     "description": "Deletes an event.",
1823
+     "parameters": {
1824
+      "calendarId": {
1825
+       "type": "string",
1826
+       "description": "Calendar identifier.",
1827
+       "required": true,
1828
+       "location": "path"
1829
+      },
1830
+      "eventId": {
1831
+       "type": "string",
1832
+       "description": "Event identifier.",
1833
+       "required": true,
1834
+       "location": "path"
1835
+      },
1836
+      "sendNotifications": {
1837
+       "type": "boolean",
1838
+       "description": "Whether to send notifications about the deletion of the event. Optional. The default is False.",
1839
+       "location": "query"
1840
+      }
1841
+     },
1842
+     "parameterOrder": [
1843
+      "calendarId",
1844
+      "eventId"
1845
+     ],
1846
+     "scopes": [
1847
+      "https://www.googleapis.com/auth/calendar"
1848
+     ]
1849
+    },
1850
+    "get": {
1851
+     "id": "calendar.events.get",
1852
+     "path": "calendars/{calendarId}/events/{eventId}",
1853
+     "httpMethod": "GET",
1854
+     "description": "Returns an event.",
1855
+     "parameters": {
1856
+      "alwaysIncludeEmail": {
1857
+       "type": "boolean",
1858
+       "description": "Whether to always include a value in the email field for the organizer, creator and attendees, even if no real email is available (i.e. a generated, non-working value will be provided). The use of this option is discouraged and should only be used by clients which cannot handle the absence of an email address value in the mentioned places. Optional. The default is False.",
1859
+       "location": "query"
1860
+      },
1861
+      "calendarId": {
1862
+       "type": "string",
1863
+       "description": "Calendar identifier.",
1864
+       "required": true,
1865
+       "location": "path"
1866
+      },
1867
+      "eventId": {
1868
+       "type": "string",
1869
+       "description": "Event identifier.",
1870
+       "required": true,
1871
+       "location": "path"
1872
+      },
1873
+      "maxAttendees": {
1874
+       "type": "integer",
1875
+       "description": "The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.",
1876
+       "format": "int32",
1877
+       "minimum": "1",
1878
+       "location": "query"
1879
+      },
1880
+      "timeZone": {
1881
+       "type": "string",
1882
+       "description": "Time zone used in the response. Optional. The default is the time zone of the calendar.",
1883
+       "location": "query"
1884
+      }
1885
+     },
1886
+     "parameterOrder": [
1887
+      "calendarId",
1888
+      "eventId"
1889
+     ],
1890
+     "response": {
1891
+      "$ref": "Event"
1892
+     },
1893
+     "scopes": [
1894
+      "https://www.googleapis.com/auth/calendar",
1895
+      "https://www.googleapis.com/auth/calendar.readonly"
1896
+     ]
1897
+    },
1898
+    "import": {
1899
+     "id": "calendar.events.import",
1900
+     "path": "calendars/{calendarId}/events/import",
1901
+     "httpMethod": "POST",
1902
+     "description": "Imports an event. This operation is used to add a private copy of an existing event to a calendar.",
1903
+     "parameters": {
1904
+      "calendarId": {
1905
+       "type": "string",
1906
+       "description": "Calendar identifier.",
1907
+       "required": true,
1908
+       "location": "path"
1909
+      }
1910
+     },
1911
+     "parameterOrder": [
1912
+      "calendarId"
1913
+     ],
1914
+     "request": {
1915
+      "$ref": "Event"
1916
+     },
1917
+     "response": {
1918
+      "$ref": "Event"
1919
+     },
1920
+     "scopes": [
1921
+      "https://www.googleapis.com/auth/calendar"
1922
+     ]
1923
+    },
1924
+    "insert": {
1925
+     "id": "calendar.events.insert",
1926
+     "path": "calendars/{calendarId}/events",
1927
+     "httpMethod": "POST",
1928
+     "description": "Creates an event.",
1929
+     "parameters": {
1930
+      "calendarId": {
1931
+       "type": "string",
1932
+       "description": "Calendar identifier.",
1933
+       "required": true,
1934
+       "location": "path"
1935
+      },
1936
+      "maxAttendees": {
1937
+       "type": "integer",
1938
+       "description": "The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.",
1939
+       "format": "int32",
1940
+       "minimum": "1",
1941
+       "location": "query"
1942
+      },
1943
+      "sendNotifications": {
1944
+       "type": "boolean",
1945
+       "description": "Whether to send notifications about the creation of the new event. Optional. The default is False.",
1946
+       "location": "query"
1947
+      }
1948
+     },
1949
+     "parameterOrder": [
1950
+      "calendarId"
1951
+     ],
1952
+     "request": {
1953
+      "$ref": "Event"
1954
+     },
1955
+     "response": {
1956
+      "$ref": "Event"
1957
+     },
1958
+     "scopes": [
1959
+      "https://www.googleapis.com/auth/calendar"
1960
+     ]
1961
+    },
1962
+    "instances": {
1963
+     "id": "calendar.events.instances",
1964
+     "path": "calendars/{calendarId}/events/{eventId}/instances",
1965
+     "httpMethod": "GET",
1966
+     "description": "Returns instances of the specified recurring event.",
1967
+     "parameters": {
1968
+      "alwaysIncludeEmail": {
1969
+       "type": "boolean",
1970
+       "description": "Whether to always include a value in the email field for the organizer, creator and attendees, even if no real email is available (i.e. a generated, non-working value will be provided). The use of this option is discouraged and should only be used by clients which cannot handle the absence of an email address value in the mentioned places. Optional. The default is False.",
1971
+       "location": "query"
1972
+      },
1973
+      "calendarId": {
1974
+       "type": "string",
1975
+       "description": "Calendar identifier.",
1976
+       "required": true,
1977
+       "location": "path"
1978
+      },
1979
+      "eventId": {
1980
+       "type": "string",
1981
+       "description": "Recurring event identifier.",
1982
+       "required": true,
1983
+       "location": "path"
1984
+      },
1985
+      "maxAttendees": {
1986
+       "type": "integer",
1987
+       "description": "The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.",
1988
+       "format": "int32",
1989
+       "minimum": "1",
1990
+       "location": "query"
1991
+      },
1992
+      "maxResults": {
1993
+       "type": "integer",
1994
+       "description": "Maximum number of events returned on one result page. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.",
1995
+       "format": "int32",
1996
+       "minimum": "1",
1997
+       "location": "query"
1998
+      },
1999
+      "originalStart": {
2000
+       "type": "string",
2001
+       "description": "The original start time of the instance in the result. Optional.",
2002
+       "location": "query"
2003
+      },
2004
+      "pageToken": {
2005
+       "type": "string",
2006
+       "description": "Token specifying which result page to return. Optional.",
2007
+       "location": "query"
2008
+      },
2009
+      "showDeleted": {
2010
+       "type": "boolean",
2011
+       "description": "Whether to include deleted events (with status equals \"cancelled\") in the result. Cancelled instances of recurring events will still be included if singleEvents is False. Optional. The default is False.",
2012
+       "location": "query"
2013
+      },
2014
+      "timeMax": {
2015
+       "type": "string",
2016
+       "description": "Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time.",
2017
+       "format": "date-time",
2018
+       "location": "query"
2019
+      },
2020
+      "timeMin": {
2021
+       "type": "string",
2022
+       "description": "Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time.",
2023
+       "format": "date-time",
2024
+       "location": "query"
2025
+      },
2026
+      "timeZone": {
2027
+       "type": "string",
2028
+       "description": "Time zone used in the response. Optional. The default is the time zone of the calendar.",
2029
+       "location": "query"
2030
+      }
2031
+     },
2032
+     "parameterOrder": [
2033
+      "calendarId",
2034
+      "eventId"
2035
+     ],
2036
+     "response": {
2037
+      "$ref": "Events"
2038
+     },
2039
+     "scopes": [
2040
+      "https://www.googleapis.com/auth/calendar",
2041
+      "https://www.googleapis.com/auth/calendar.readonly"
2042
+     ],
2043
+     "supportsSubscription": true
2044
+    },
2045
+    "list": {
2046
+     "id": "calendar.events.list",
2047
+     "path": "calendars/{calendarId}/events",
2048
+     "httpMethod": "GET",
2049
+     "description": "Returns events on the specified calendar.",
2050
+     "parameters": {
2051
+      "alwaysIncludeEmail": {
2052
+       "type": "boolean",
2053
+       "description": "Whether to always include a value in the email field for the organizer, creator and attendees, even if no real email is available (i.e. a generated, non-working value will be provided). The use of this option is discouraged and should only be used by clients which cannot handle the absence of an email address value in the mentioned places. Optional. The default is False.",
2054
+       "location": "query"
2055
+      },
2056
+      "calendarId": {
2057
+       "type": "string",
2058
+       "description": "Calendar identifier.",
2059
+       "required": true,
2060
+       "location": "path"
2061
+      },
2062
+      "iCalUID": {
2063
+       "type": "string",
2064
+       "description": "Specifies event ID in the iCalendar format to be included in the response. Optional.",
2065
+       "location": "query"
2066
+      },
2067
+      "maxAttendees": {
2068
+       "type": "integer",
2069
+       "description": "The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.",
2070
+       "format": "int32",
2071
+       "minimum": "1",
2072
+       "location": "query"
2073
+      },
2074
+      "maxResults": {
2075
+       "type": "integer",
2076
+       "description": "Maximum number of events returned on one result page. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.",
2077
+       "format": "int32",
2078
+       "minimum": "1",
2079
+       "location": "query"
2080
+      },
2081
+      "orderBy": {
2082
+       "type": "string",
2083
+       "description": "The order of the events returned in the result. Optional. The default is an unspecified, stable order.",
2084
+       "enum": [
2085
+        "startTime",
2086
+        "updated"
2087
+       ],
2088
+       "enumDescriptions": [
2089
+        "Order by the start date/time (ascending). This is only available when querying single events (i.e. the parameter singleEvents is True)",
2090
+        "Order by last modification time (ascending)."
2091
+       ],
2092
+       "location": "query"
2093
+      },
2094
+      "pageToken": {
2095
+       "type": "string",
2096
+       "description": "Token specifying which result page to return. Optional.",
2097
+       "location": "query"
2098
+      },
2099
+      "privateExtendedProperty": {
2100
+       "type": "string",
2101
+       "description": "Extended properties constraint specified as propertyName=value. Matches only private properties. This parameter might be repeated multiple times to return events that match all given constraints.",
2102
+       "repeated": true,
2103
+       "location": "query"
2104
+      },
2105
+      "q": {
2106
+       "type": "string",
2107
+       "description": "Free text search terms to find events that match these terms in any field, except for extended properties. Optional.",
2108
+       "location": "query"
2109
+      },
2110
+      "sharedExtendedProperty": {
2111
+       "type": "string",
2112
+       "description": "Extended properties constraint specified as propertyName=value. Matches only shared properties. This parameter might be repeated multiple times to return events that match all given constraints.",
2113
+       "repeated": true,
2114
+       "location": "query"
2115
+      },
2116
+      "showDeleted": {
2117
+       "type": "boolean",
2118
+       "description": "Whether to include deleted events (with status equals \"cancelled\") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. Optional. The default is False.",
2119
+       "location": "query"
2120
+      },
2121
+      "showHiddenInvitations": {
2122
+       "type": "boolean",
2123
+       "description": "Whether to include hidden invitations in the result. Optional. The default is False.",
2124
+       "location": "query"
2125
+      },
2126
+      "singleEvents": {
2127
+       "type": "boolean",
2128
+       "description": "Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False.",
2129
+       "location": "query"
2130
+      },
2131
+      "syncToken": {
2132
+       "type": "string",
2133
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All events deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.\nThere are several query parameters that cannot be specified together with nextSyncToken to ensure consistency of the client state.\n\nThese are: \n- iCalUID \n- orderBy \n- privateExtendedProperty \n- q \n- sharedExtendedProperty \n- timeMin \n- timeMax \n- updatedMin If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
2134
+       "location": "query"
2135
+      },
2136
+      "timeMax": {
2137
+       "type": "string",
2138
+       "description": "Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time.",
2139
+       "format": "date-time",
2140
+       "location": "query"
2141
+      },
2142
+      "timeMin": {
2143
+       "type": "string",
2144
+       "description": "Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time.",
2145
+       "format": "date-time",
2146
+       "location": "query"
2147
+      },
2148
+      "timeZone": {
2149
+       "type": "string",
2150
+       "description": "Time zone used in the response. Optional. The default is the time zone of the calendar.",
2151
+       "location": "query"
2152
+      },
2153
+      "updatedMin": {
2154
+       "type": "string",
2155
+       "description": "Lower bound for an event's last modification time (as a RFC 3339 timestamp) to filter by. When specified, entries deleted since this time will always be included regardless of showDeleted. Optional. The default is not to filter by last modification time.",
2156
+       "format": "date-time",
2157
+       "location": "query"
2158
+      }
2159
+     },
2160
+     "parameterOrder": [
2161
+      "calendarId"
2162
+     ],
2163
+     "response": {
2164
+      "$ref": "Events"
2165
+     },
2166
+     "scopes": [
2167
+      "https://www.googleapis.com/auth/calendar",
2168
+      "https://www.googleapis.com/auth/calendar.readonly"
2169
+     ],
2170
+     "supportsSubscription": true
2171
+    },
2172
+    "move": {
2173
+     "id": "calendar.events.move",
2174
+     "path": "calendars/{calendarId}/events/{eventId}/move",
2175
+     "httpMethod": "POST",
2176
+     "description": "Moves an event to another calendar, i.e. changes an event's organizer.",
2177
+     "parameters": {
2178
+      "calendarId": {
2179
+       "type": "string",
2180
+       "description": "Calendar identifier of the source calendar where the event currently is on.",
2181
+       "required": true,
2182
+       "location": "path"
2183
+      },
2184
+      "destination": {
2185
+       "type": "string",
2186
+       "description": "Calendar identifier of the target calendar where the event is to be moved to.",
2187
+       "required": true,
2188
+       "location": "query"
2189
+      },
2190
+      "eventId": {
2191
+       "type": "string",
2192
+       "description": "Event identifier.",
2193
+       "required": true,
2194
+       "location": "path"
2195
+      },
2196
+      "sendNotifications": {
2197
+       "type": "boolean",
2198
+       "description": "Whether to send notifications about the change of the event's organizer. Optional. The default is False.",
2199
+       "location": "query"
2200
+      }
2201
+     },
2202
+     "parameterOrder": [
2203
+      "calendarId",
2204
+      "eventId",
2205
+      "destination"
2206
+     ],
2207
+     "response": {
2208
+      "$ref": "Event"
2209
+     },
2210
+     "scopes": [
2211
+      "https://www.googleapis.com/auth/calendar"
2212
+     ]
2213
+    },
2214
+    "patch": {
2215
+     "id": "calendar.events.patch",
2216
+     "path": "calendars/{calendarId}/events/{eventId}",
2217
+     "httpMethod": "PATCH",
2218
+     "description": "Updates an event. This method supports patch semantics.",
2219
+     "parameters": {
2220
+      "alwaysIncludeEmail": {
2221
+       "type": "boolean",
2222
+       "description": "Whether to always include a value in the email field for the organizer, creator and attendees, even if no real email is available (i.e. a generated, non-working value will be provided). The use of this option is discouraged and should only be used by clients which cannot handle the absence of an email address value in the mentioned places. Optional. The default is False.",
2223
+       "location": "query"
2224
+      },
2225
+      "calendarId": {
2226
+       "type": "string",
2227
+       "description": "Calendar identifier.",
2228
+       "required": true,
2229
+       "location": "path"
2230
+      },
2231
+      "eventId": {
2232
+       "type": "string",
2233
+       "description": "Event identifier.",
2234
+       "required": true,
2235
+       "location": "path"
2236
+      },
2237
+      "maxAttendees": {
2238
+       "type": "integer",
2239
+       "description": "The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.",
2240
+       "format": "int32",
2241
+       "minimum": "1",
2242
+       "location": "query"
2243
+      },
2244
+      "sendNotifications": {
2245
+       "type": "boolean",
2246
+       "description": "Whether to send notifications about the event update (e.g. attendee's responses, title changes, etc.). Optional. The default is False.",
2247
+       "location": "query"
2248
+      }
2249
+     },
2250
+     "parameterOrder": [
2251
+      "calendarId",
2252
+      "eventId"
2253
+     ],
2254
+     "request": {
2255
+      "$ref": "Event"
2256
+     },
2257
+     "response": {
2258
+      "$ref": "Event"
2259
+     },
2260
+     "scopes": [
2261
+      "https://www.googleapis.com/auth/calendar"
2262
+     ]
2263
+    },
2264
+    "quickAdd": {
2265
+     "id": "calendar.events.quickAdd",
2266
+     "path": "calendars/{calendarId}/events/quickAdd",
2267
+     "httpMethod": "POST",
2268
+     "description": "Creates an event based on a simple text string.",
2269
+     "parameters": {
2270
+      "calendarId": {
2271
+       "type": "string",
2272
+       "description": "Calendar identifier.",
2273
+       "required": true,
2274
+       "location": "path"
2275
+      },
2276
+      "sendNotifications": {
2277
+       "type": "boolean",
2278
+       "description": "Whether to send notifications about the creation of the event. Optional. The default is False.",
2279
+       "location": "query"
2280
+      },
2281
+      "text": {
2282
+       "type": "string",
2283
+       "description": "The text describing the event to be created.",
2284
+       "required": true,
2285
+       "location": "query"
2286
+      }
2287
+     },
2288
+     "parameterOrder": [
2289
+      "calendarId",
2290
+      "text"
2291
+     ],
2292
+     "response": {
2293
+      "$ref": "Event"
2294
+     },
2295
+     "scopes": [
2296
+      "https://www.googleapis.com/auth/calendar"
2297
+     ]
2298
+    },
2299
+    "update": {
2300
+     "id": "calendar.events.update",
2301
+     "path": "calendars/{calendarId}/events/{eventId}",
2302
+     "httpMethod": "PUT",
2303
+     "description": "Updates an event.",
2304
+     "parameters": {
2305
+      "alwaysIncludeEmail": {
2306
+       "type": "boolean",
2307
+       "description": "Whether to always include a value in the email field for the organizer, creator and attendees, even if no real email is available (i.e. a generated, non-working value will be provided). The use of this option is discouraged and should only be used by clients which cannot handle the absence of an email address value in the mentioned places. Optional. The default is False.",
2308
+       "location": "query"
2309
+      },
2310
+      "calendarId": {
2311
+       "type": "string",
2312
+       "description": "Calendar identifier.",
2313
+       "required": true,
2314
+       "location": "path"
2315
+      },
2316
+      "eventId": {
2317
+       "type": "string",
2318
+       "description": "Event identifier.",
2319
+       "required": true,
2320
+       "location": "path"
2321
+      },
2322
+      "maxAttendees": {
2323
+       "type": "integer",
2324
+       "description": "The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.",
2325
+       "format": "int32",
2326
+       "minimum": "1",
2327
+       "location": "query"
2328
+      },
2329
+      "sendNotifications": {
2330
+       "type": "boolean",
2331
+       "description": "Whether to send notifications about the event update (e.g. attendee's responses, title changes, etc.). Optional. The default is False.",
2332
+       "location": "query"
2333
+      }
2334
+     },
2335
+     "parameterOrder": [
2336
+      "calendarId",
2337
+      "eventId"
2338
+     ],
2339
+     "request": {
2340
+      "$ref": "Event"
2341
+     },
2342
+     "response": {
2343
+      "$ref": "Event"
2344
+     },
2345
+     "scopes": [
2346
+      "https://www.googleapis.com/auth/calendar"
2347
+     ]
2348
+    },
2349
+    "watch": {
2350
+     "id": "calendar.events.watch",
2351
+     "path": "calendars/{calendarId}/events/watch",
2352
+     "httpMethod": "POST",
2353
+     "description": "Watch for changes to Events resources.",
2354
+     "parameters": {
2355
+      "alwaysIncludeEmail": {
2356
+       "type": "boolean",
2357
+       "description": "Whether to always include a value in the email field for the organizer, creator and attendees, even if no real email is available (i.e. a generated, non-working value will be provided). The use of this option is discouraged and should only be used by clients which cannot handle the absence of an email address value in the mentioned places. Optional. The default is False.",
2358
+       "location": "query"
2359
+      },
2360
+      "calendarId": {
2361
+       "type": "string",
2362
+       "description": "Calendar identifier.",
2363
+       "required": true,
2364
+       "location": "path"
2365
+      },
2366
+      "iCalUID": {
2367
+       "type": "string",
2368
+       "description": "Specifies event ID in the iCalendar format to be included in the response. Optional.",
2369
+       "location": "query"
2370
+      },
2371
+      "maxAttendees": {
2372
+       "type": "integer",
2373
+       "description": "The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.",
2374
+       "format": "int32",
2375
+       "minimum": "1",
2376
+       "location": "query"
2377
+      },
2378
+      "maxResults": {
2379
+       "type": "integer",
2380
+       "description": "Maximum number of events returned on one result page. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.",
2381
+       "format": "int32",
2382
+       "minimum": "1",
2383
+       "location": "query"
2384
+      },
2385
+      "orderBy": {
2386
+       "type": "string",
2387
+       "description": "The order of the events returned in the result. Optional. The default is an unspecified, stable order.",
2388
+       "enum": [
2389
+        "startTime",
2390
+        "updated"
2391
+       ],
2392
+       "enumDescriptions": [
2393
+        "Order by the start date/time (ascending). This is only available when querying single events (i.e. the parameter singleEvents is True)",
2394
+        "Order by last modification time (ascending)."
2395
+       ],
2396
+       "location": "query"
2397
+      },
2398
+      "pageToken": {
2399
+       "type": "string",
2400
+       "description": "Token specifying which result page to return. Optional.",
2401
+       "location": "query"
2402
+      },
2403
+      "privateExtendedProperty": {
2404
+       "type": "string",
2405
+       "description": "Extended properties constraint specified as propertyName=value. Matches only private properties. This parameter might be repeated multiple times to return events that match all given constraints.",
2406
+       "repeated": true,
2407
+       "location": "query"
2408
+      },
2409
+      "q": {
2410
+       "type": "string",
2411
+       "description": "Free text search terms to find events that match these terms in any field, except for extended properties. Optional.",
2412
+       "location": "query"
2413
+      },
2414
+      "sharedExtendedProperty": {
2415
+       "type": "string",
2416
+       "description": "Extended properties constraint specified as propertyName=value. Matches only shared properties. This parameter might be repeated multiple times to return events that match all given constraints.",
2417
+       "repeated": true,
2418
+       "location": "query"
2419
+      },
2420
+      "showDeleted": {
2421
+       "type": "boolean",
2422
+       "description": "Whether to include deleted events (with status equals \"cancelled\") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. Optional. The default is False.",
2423
+       "location": "query"
2424
+      },
2425
+      "showHiddenInvitations": {
2426
+       "type": "boolean",
2427
+       "description": "Whether to include hidden invitations in the result. Optional. The default is False.",
2428
+       "location": "query"
2429
+      },
2430
+      "singleEvents": {
2431
+       "type": "boolean",
2432
+       "description": "Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False.",
2433
+       "location": "query"
2434
+      },
2435
+      "syncToken": {
2436
+       "type": "string",
2437
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All events deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.\nThere are several query parameters that cannot be specified together with nextSyncToken to ensure consistency of the client state.\n\nThese are: \n- iCalUID \n- orderBy \n- privateExtendedProperty \n- q \n- sharedExtendedProperty \n- timeMin \n- timeMax \n- updatedMin If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
2438
+       "location": "query"
2439
+      },
2440
+      "timeMax": {
2441
+       "type": "string",
2442
+       "description": "Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time.",
2443
+       "format": "date-time",
2444
+       "location": "query"
2445
+      },
2446
+      "timeMin": {
2447
+       "type": "string",
2448
+       "description": "Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time.",
2449
+       "format": "date-time",
2450
+       "location": "query"
2451
+      },
2452
+      "timeZone": {
2453
+       "type": "string",
2454
+       "description": "Time zone used in the response. Optional. The default is the time zone of the calendar.",
2455
+       "location": "query"
2456
+      },
2457
+      "updatedMin": {
2458
+       "type": "string",
2459
+       "description": "Lower bound for an event's last modification time (as a RFC 3339 timestamp) to filter by. When specified, entries deleted since this time will always be included regardless of showDeleted. Optional. The default is not to filter by last modification time.",
2460
+       "format": "date-time",
2461
+       "location": "query"
2462
+      }
2463
+     },
2464
+     "parameterOrder": [
2465
+      "calendarId"
2466
+     ],
2467
+     "request": {
2468
+      "$ref": "Channel",
2469
+      "parameterName": "resource"
2470
+     },
2471
+     "response": {
2472
+      "$ref": "Channel"
2473
+     },
2474
+     "scopes": [
2475
+      "https://www.googleapis.com/auth/calendar",
2476
+      "https://www.googleapis.com/auth/calendar.readonly"
2477
+     ],
2478
+     "supportsSubscription": true
2479
+    }
2480
+   }
2481
+  },
2482
+  "freebusy": {
2483
+   "methods": {
2484
+    "query": {
2485
+     "id": "calendar.freebusy.query",
2486
+     "path": "freeBusy",
2487
+     "httpMethod": "POST",
2488
+     "description": "Returns free/busy information for a set of calendars.",
2489
+     "request": {
2490
+      "$ref": "FreeBusyRequest"
2491
+     },
2492
+     "response": {
2493
+      "$ref": "FreeBusyResponse"
2494
+     },
2495
+     "scopes": [
2496
+      "https://www.googleapis.com/auth/calendar",
2497
+      "https://www.googleapis.com/auth/calendar.readonly"
2498
+     ]
2499
+    }
2500
+   }
2501
+  },
2502
+  "settings": {
2503
+   "methods": {
2504
+    "get": {
2505
+     "id": "calendar.settings.get",
2506
+     "path": "users/me/settings/{setting}",
2507
+     "httpMethod": "GET",
2508
+     "description": "Returns a single user setting.",
2509
+     "parameters": {
2510
+      "setting": {
2511
+       "type": "string",
2512
+       "description": "The id of the user setting.",
2513
+       "required": true,
2514
+       "location": "path"
2515
+      }
2516
+     },
2517
+     "parameterOrder": [
2518
+      "setting"
2519
+     ],
2520
+     "response": {
2521
+      "$ref": "Setting"
2522
+     },
2523
+     "scopes": [
2524
+      "https://www.googleapis.com/auth/calendar",
2525
+      "https://www.googleapis.com/auth/calendar.readonly"
2526
+     ]
2527
+    },
2528
+    "list": {
2529
+     "id": "calendar.settings.list",
2530
+     "path": "users/me/settings",
2531
+     "httpMethod": "GET",
2532
+     "description": "Returns all user settings for the authenticated user.",
2533
+     "parameters": {
2534
+      "maxResults": {
2535
+       "type": "integer",
2536
+       "description": "Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.",
2537
+       "format": "int32",
2538
+       "minimum": "1",
2539
+       "location": "query"
2540
+      },
2541
+      "pageToken": {
2542
+       "type": "string",
2543
+       "description": "Token specifying which result page to return. Optional.",
2544
+       "location": "query"
2545
+      },
2546
+      "syncToken": {
2547
+       "type": "string",
2548
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then.\nIf the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
2549
+       "location": "query"
2550
+      }
2551
+     },
2552
+     "response": {
2553
+      "$ref": "Settings"
2554
+     },
2555
+     "scopes": [
2556
+      "https://www.googleapis.com/auth/calendar",
2557
+      "https://www.googleapis.com/auth/calendar.readonly"
2558
+     ],
2559
+     "supportsSubscription": true
2560
+    },
2561
+    "watch": {
2562
+     "id": "calendar.settings.watch",
2563
+     "path": "users/me/settings/watch",
2564
+     "httpMethod": "POST",
2565
+     "description": "Watch for changes to Settings resources.",
2566
+     "parameters": {
2567
+      "maxResults": {
2568
+       "type": "integer",
2569
+       "description": "Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.",
2570
+       "format": "int32",
2571
+       "minimum": "1",
2572
+       "location": "query"
2573
+      },
2574
+      "pageToken": {
2575
+       "type": "string",
2576
+       "description": "Token specifying which result page to return. Optional.",
2577
+       "location": "query"
2578
+      },
2579
+      "syncToken": {
2580
+       "type": "string",
2581
+       "description": "Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then.\nIf the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.\nLearn more about incremental synchronization.\nOptional. The default is to return all entries.",
2582
+       "location": "query"
2583
+      }
2584
+     },
2585
+     "request": {
2586
+      "$ref": "Channel",
2587
+      "parameterName": "resource"
2588
+     },
2589
+     "response": {
2590
+      "$ref": "Channel"
2591
+     },
2592
+     "scopes": [
2593
+      "https://www.googleapis.com/auth/calendar",
2594
+      "https://www.googleapis.com/auth/calendar.readonly"
2595
+     ],
2596
+     "supportsSubscription": true
2597
+    }
2598
+   }
2599
+  }
2600
+ }
2601
+}

BIN
spec/data_fixtures/private.key


+ 42 - 0
spec/models/agents/google_calendar_publish_agent_spec.rb

@@ -0,0 +1,42 @@
1
+require 'spec_helper'
2
+
3
+describe Agents::GoogleCalendarPublishAgent, :vcr do
4
+	before do
5
+		@valid_params = {
6
+        'expected_update_period_in_days' => "10",
7
+        'calendar_id' => 'sqv39gj35tc837gdns1g4d81cg@group.calendar.google.com',
8
+        'message' => "{{text}}",
9
+        'google' => {
10
+          'key_file' => File.dirname(__FILE__) + '/../../data_fixtures/private.key',
11
+          'key_secret' => 'notasecret',
12
+          'service_account_email' => '1029936966326-ncjd7776pcspc98hsg82gsb56t3217ef@developer.gserviceaccount.com'
13
+        }
14
+      }
15
+		@checker = Agents::GoogleCalendarPublishAgent.new(:name => "somename", :options => @valid_params)
16
+		@checker.user = users(:jane)
17
+		@checker.save!
18
+	end
19
+
20
+  describe '#receive' do
21
+    it 'should publish any payload it receives' do
22
+      event1 = Event.new
23
+      event1.agent = agents(:bob_manual_event_agent)
24
+      event1.payload = { 
25
+        'visibility' => 'default',
26
+        'summary' => "Awesome event",
27
+        'description' => "An example event with text. Pro tip: DateTimes are in RFC3339",
28
+        'end' => {
29
+          'dateTime' => '2014-10-02T11:00:00-05:00'
30
+        },
31
+        'start' => {
32
+          'dateTime' => '2014-10-02T10:00:00-05:00'
33
+        }       
34
+      }
35
+      event1.save!
36
+
37
+      @checker.receive([event1])
38
+
39
+      @checker.events.count.should eq(1)
40
+    end
41
+  end
42
+end